我在std :: fstream类中使用tellg()函数遇到问题。通常,它应该返回当前字符在输入流中的位置。但是,它对我来说很奇怪。下面是一些简短的示例代码:

#include <iostream>
#include <fstream>

using namespace std;

int main(void) {
char c;
ifstream czytaj;
czytaj.open("test_file.txt");

cout << czytaj.tellg() << endl;     //is 0 should be 0
czytaj.peek();                      //is 0 should be 0
cout << czytaj.tellg() << endl;     //is 2 should be 0    !!
czytaj.get(c);                      //is 3 should be 3
czytaj.get(c);                      //is 4 should be 4
cout << czytaj.tellg() << endl;     //is 6 should be 4    !!

int r; cin >> r;
return 0;
}


虽然txt文件如下所示:

abcdefghij
kturjbkfvd


编译后,我得到如下输出:

0
2
6


第一次使用tellg()可以正常工作,它将位置0作为文件的开头。不幸的是,每次下一次使用都像在位置上增加+2。结果,我从流中提取了字母“ c”和“ d”。 Tellg()和peek()都应该不改变位置,所以我应该得到字母“ a”和“ b”,而正确的结果应该是:

0
0
2


如果我在txt文件中使用ANSI编码,则会发生此类情况。当我将其更改为Unicode时,它应能正常工作。另外,如果我使用ANSI和其他二进制模式ios :: binary,它也可以正常工作。奇怪的事实是,在我的另一台计算机上,即使使用ANSI并且没有ios :: binary,它也可以正常工作。为什么会发生?

编辑:忘记提及非常重要的事实。如果我从此示例代码中删除所有包含tellg()的行,则提取是正确的-我得到字母“ a”和“ b”。

最佳答案

tellg()告诉您文件中下一个“获取”位置。由于在Windows中使用CR + LF('\r','\n')作为换行符的文件具有两个字符作为换行符,因此在您的程序中,C ++(和C)标准要求换行符以LF '\n'作为单个字符。读取CR + LF序列,C运行时将其视为一个字符,但是从中获取下一个字符的文件位置向前两步。

关于c++ - Tellg()函数C++的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16626520/

10-11 15:55