gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:13 25 4
gpt4 key购买 nike

我正在尝试使用 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 的一个 BUG 当您以文本模式阅读 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com