我遇到了 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”。