我正在学习用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;
这里解释了您的问题原因,例如:
为什么std::getLine()在格式化提取后跳过输入?
但是,关于的实际问题,请参阅KG
。 以文本模式打开文件。 这意味着当您读取文件时,换行符将作为单个字符'\n'
提供给您的C++代码。 但是在磁盘上,它们可能是其他的东西,并且看起来你是在Windows上运行你的代码。 文本文件中的换行通常是两个字节,即CR(ASCII代码13)和LF(ASCII代码10)。 在文本模式下读取或写入将为您执行C++字符串中的单个字符与文件中的两个字节之间的这种转换。
seekg
处理偏移量,并不关心这一点,偏移量是相同的,无论您以文本或二进制模式打开文件。 如果您使用seekg
跳过新行,那么您的代码将变得依赖于平台,在Windows上,您需要跳过2个字节,如上面所解释的,而在其他平台(如Unix)中,您只需要跳过单个字节。
因此,不要使用seekg
用于此目的,请参阅链接的问题以获得更好的解决方案。