从文件中读取时tellg()的行为

How does tellg() behave when reading from file?

本文关键字:tellg 文件 读取      更新时间:2023-10-16

我正在尝试使用fstream从文件中读取要阅读的内容有:

1200
1000
980
890
760
我代码:

#include <fstream>
#include <iostream>
using namespace std;
int main ()
{
    fstream file("highscores.txt", ios::in | ios::out);
    if (!file.is_open())
    {
        cout << "Could not open file!" << endl;
        return 0;
    }
    int cur_score; 
    while (!file.eof())
    {
        file >> cur_score;
        cout << file.tellg() << endl;
    }
}

输出为:

9
14
18
22
26

为什么第一次读取tellg()返回9,第一次读取的是数字(1200),即4个位置我知道有rn所以这是6个位置。也。如果我添加更多的数字在我的文件tellg()将第一次读取后返回更大的数字

如果您使用文本编辑器将文件保存为UTF8格式,那么在文件的开头可能会有一个UTF8 BOM。这个BOM有3个字符长,所以加上6个字符,就是9个字符。

如果您想要确定,请检查文件的开头,使用:

fstream file("highscores.txt", ios::in | ios::out | ios::binary);
if(file) {
    char verify[16];
    file.read(verify, sizeof(verify));
    int rd = file.gcount();
    for(int i = 0; i<rd; i++) {
        cout << hex << setw(2) << (int)verify[i] << " ";
    }
    cout <<dec << endl;
}
编辑:

在windows上运行MSVC2013文件,我发现4、10、15、20、25和预期一样,我无法复制你的数字。

我现在已经用mingw做了一个测试,在这里我得到了你的确切数字,并且奇怪的效果是增加行数会增加输出。

这是MINGW的错误,当你在文本模式下读取你的windows (CRLF行分隔符)文件:

  • 如果我以UNIX样式保存文件(即LF行分隔符),我将得到相同的程序4,9,13,17,这也是linux系统的期望值。

  • 如果我以WINDOWS样式保存文件(即CRLF行分隔符),并且如果我更改代码以在ios::binary中打开文件,我会得到等待的4,10,15,20,25。

显然这是一个老问题。