ifstream tellg()不返回正确的位置

9

read.cpp

#include <iostream>
#include <fstream>

using namespace std;

int main(void)
{
    int id;
    char name[50];
    ifstream myfile("savingaccount.txt");  //open the file
    myfile >> id;
    cout << myfile.tellg(); //return 16? but not 7 or 8
    cout << id ;

    return 0;
}

savingaccount.txt

1800567
Ho Rui Jang
21
Female
Malaysian
012-4998192
20, Lorong 13, Taman Patani Janam
Melaka
Sungai Dulong

问题

我期望tellg()返回78,因为第一行是7位数字1800567,所以流指针应该在这个数值后面,字符串"Ho Rui Jang"之前,但实际上tellg()返回了16。为什么会这样?


1
文件使用特殊编码保存了吗?在 Visual Studio 2010 上使用 ANSI 编码似乎能正常工作(报告 7)。 - lccarrasco
实际上,文件中的数据是使用ofstream写入的,问题只存在于我使用ofstream写入数据时,上述代码再次返回错误的tellg()位置。当文件是手写的(使用键盘输入)时,这种情况不会发生。 - caramel1995
你介意添加一个写入文件的函数/方法吗?如果在键入文件时它能正常工作,那么可能是填充问题或类似的问题。 - lccarrasco
在Windows上,以文本模式打开文件时,寻址和位置操作存在缺陷。 - Daniel
3个回答

10

我遇到了相同的问题。尝试以二进制方式读取文件流:

    ifstream myfile("savingaccount.txt",ios::binary);

它对我有帮助


对我来说也是这样。我认为,如果文件是UTF-8格式而没有设置二进制标志,ifstream会将“é”作为一个字符加载,而实际上它占两个字符的位置。 - GLCraft
如果您使用的是Windows系统,这个答案将会非常有用。 - analytical_prat

6
这不是编译器出错。 tellg() 没有保证返回从文件开头的偏移量。 它只提供了一组最小的保证,例如,如果将 tellg() 的返回值传递给 seekg(),则文件指针将定位于文件中对应的位置。在实践中,Unix 下 tellg() 确实返回从文件开头的偏移量。而在 Windows 下,仅当以二进制模式打开文件时,tellg() 才会返回从文件开头的偏移量。
但唯一的真正保证是,从 tellg() 返回的不同值将对应于文件中的不同位置。

当我使用tellg()保存一个位置,并使用seekg()重新设置它时,它会在文件中稍后的另一个位置。 (win7 mingw gcc 5.3.0)。 - jtbr

3
这似乎更像是编译器错误(可能是gcc)。
使用以下代码:
#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{
    int id;
    char name[50];
    ifstream myfile("savingaccount.txt");  //open the file
    cout << myfile.tellg()<<endl;
    myfile >> id;
    streamoff pos=myfile.tellg();
    cout <<"pos= "<<pos<<'\n';
    cout <<"id= " << id<<'\n' ;
    return 0;
}

以下是输出结果:-
在这张图片中,inpstr.exe 是由 Visual Studio的cl 生成的,而 inp.exe 是由 g++(gcc版本4.6.1(tdm-1)) 生成的。

4
或许应该提交一个错误报告,看看他们会如何回复。 - perilbrain
3
我在这里坐了5-6个小时,试图解决问题。我看起来是一个非常坚持的类型,集中精力解决问题,直到我起身拿牛奶之前,我没有想到在这里询问。现在问题是由于gcc的错误引起的。 - caramel1995
我在生活中学到了一件事...永远不要相信一件事,直到你认为你是正确的 :) - perilbrain
2
@caramel23 你在使用Windows吗?我能够在Windows上使用GCC 4.7.0重现这个问题,但在Ubuntu上使用GCC 4.6.3却没有。这可能是一个特定于Windows的错误。 - Dirk Holsopple
我在Windows 7下使用MINGW GCC 5.3.0 32位看到了这个问题,但在MSVC 2015 64位下没有出现。 - jtbr
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接