0

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

4

2 回答 2

1

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

于 2013-05-18T17:12:51.153 回答
1

有同样的问题。尝试读取文件流二进制文件:

    czytaj.open("test_file.txt",ios::binary);

它对我有帮助

于 2016-08-31T13:45:40.197 回答