从文件中读取时tellg()的行为
How does tellg() behave when reading from file?
我正在尝试使用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;
}
编辑:在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。
显然这是一个老问题。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- 查找二进制文件的大小,函数 tellg() 返回 -1
- tellg() 只对小文件返回 -1
- C 从文件中读取FSTREAM数据不会返回正确的值.inputfile.tellg返回-1
- 在 c++ 的文件处理中什么是 tellg(),它是如何工作的?
- 使用 tellg() 和 seekp() 覆盖文件
- 写入二进制文件的中间;使用tellg()查找长度
- 使用ifstream::seekg和tellg获取文件大小
- 使用 .tellg() 的输出来了解文件中的位置
- 为什么 fstream::tellg() 返回值会因输入文本文件中的换行符数而增大,当文件针对 Windows (r
- 使用tellg()确定文件的长度,最终结果为-1
- 为什么我们需要使用seekg和tellg来查找文件大小
- 当文件有换行符时,ifstream::tellg在MSVC2012和gcc(mingw)上有所不同
- 文件流tellg/tellp和gcc-4.6这是一个错误吗
- c++中的文件流处理(tellg()函数)
- tellg()函数给出了错误的文件大小
- tellg在文件中执行写入操作后移动
- 从文件中读取时tellg()的行为