gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:36:53 38 4
gpt4 key购买 nike

我在 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/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com