提问者:小点点

C++中使用seekg()读取文件的问题


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

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

abc
def
mnp

我的问题是:我不明白为什么我需要使用f.seekg(2,iOS::cur);而不是f.seekg(1,iOS::cur);我知道如何在C++中使用seekg(),我认为我只需要忽略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;

共1个答案

匿名用户

这里解释了您的问题原因,例如:
为什么std::getLine()在格式化提取后跳过输入?

但是,关于的实际问题,请参阅KG。 以文本模式打开文件。 这意味着当您读取文件时,换行符将作为单个字符'\n'提供给您的C++代码。 但是在磁盘上,它们可能是其他的东西,并且看起来你是在Windows上运行你的代码。 文本文件中的换行通常是两个字节,即CR(ASCII代码13)和LF(ASCII代码10)。 在文本模式下读取或写入将为您执行C++字符串中的单个字符与文件中的两个字节之间的这种转换。

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

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

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|seekg|读取|文件)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?