1

我正在学习用 C++ 读写文件并发现问题。

我的 test.txt 文件在 3 行中包含 3 个字符串:

abc
def
mnp

我的问题是:我不明白为什么我需要使用f.seekg(2, ios::cur); 而不是f.seekg(1, ios::cur); 我知道如何seekg()在 c++ 中使用,我认为我只需要忽略 1 个字节即可通过getline()函数获取下一行。

这是我的代码:

ifstream f;
    f.open("D:\\test.txt", ios::in);
    string str1, str2, str3;
    f >> str1;
    f.seekg(2, ios::cur);
    getline(f, str2);
    getline(f, str3);
    cout << str1 << " " << str2 << " " << str3 << endl;
4

1 回答 1

1

例如,此处解释了您遇到麻烦的原因:
Why does std::getline() skip input after a formatted extract?

但是,关于您关于seekg. 您以文本模式打开文件。这意味着当您读取文件时,C++ 代码中的换行符会以单个字符的形式出现,'\n'. 但是在磁盘上它们可能是别的东西,而且您似乎正在Windows上运行您的代码。文本文件中的换行符通常是两个字节,CR(ASCII 代码 13)和 LF(ASCII 代码 10)。以文本模式读取或写入将为您在 C++ 字符串中的单个字符与文件中的两个字节之间执行此转换。

seekg适用于偏移量并且不关心这一点,无论您以文本模式还是二进制模式打开文件,偏移量都是相同的。如果您使用seekg跳过换行,您的代码将变得依赖于平台,在 Windows 上您需要跳过 2 个字节,如上所述,而在其他平台(如 Unix)中您只需要跳过一个字节。

因此,请勿seekg用于此目的,请参阅链接问题以获得更好的解决方案。

于 2020-07-04T14:36:05.907 回答