tellg()函数c ++的奇怪行为

时间:2013-05-18 16:26:52

标签: c++

我从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'。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

它对我有帮助

相关问题