c++ - 从文件读取时tellg() 的行为如何?

标签 c++ fstream

我正在尝试使用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 个位置 我知道有 \r\n 所以这有 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;
}

编辑:

在文件上使用 MSVC2013 在 Windows 上运行,我发现了预期的 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。

显然这是一个old problem

关于c++ - 从文件读取时tellg() 的行为如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30546416/

相关文章:

c++ - 新算子+OpenMP动态调度子句

C++ 在文件中存储对象

C++ 使用 lz4 压缩,压缩信息不符合预期

c++ - std::ofstream,写入前检查文件是否存在

c++ - 未在 clang++ 中编译的具有指向方法的指针的嵌套模板类

C++ 循环依赖和继承

c++ - UE4和Azure存储SDK

c++ - 为什么我会使用 2 的补码来比较两个 double 而不是将它们的差异与 epsilon 值进行比较?

c++ - 使用c++从文件中读取特定行

c++ - vim 在 ifstream 输入期间文件末尾的新行