rdbuf() 阅读垃圾

rdbuf() reading junk

本文关键字:rdbuf      更新时间:2023-10-16

使用此代码,我从文件中读取了一个字符串。

pbuf = infile.rdbuf();
size = pbuf->pubseekoff(0, ios::end, ios::in);
pbuf->pubseekpos (0,ios::in);
buf = new char[size];
pbuf->sgetn(buf, size);
str.assign(buf, buf+size);

我必须在临时变量char* buff中读取数据,因为 sgetn 需要char*而不是string
因此,在问我的实际问题之前,如果有人知道从可能包含空格字符的文件中读取字符串的更好方法,请告诉(直到 eof,而不是循环)。

该文件的内容是:

等等等等废话在新行中

但我得到的是:

等等等等废话在新行中═

在玩弄代码时,我注意到奇怪的字符数量增加了,因为我添加了更多的n字符。似乎当我尝试获取文件大小时,每个n字符占用 2 个字节的空间,但是在字符串中它只需要 1 个字节,因此我的字符串看起来很奇怪。如何避免这种情况?

在 Windows 上,文本文件中行尾的表示形式是两个字节:0x0d、0x0a。使用文本模式从此类文件读取时,这两个字节将转换为单个字符""。当您使用二进制模式时,您正在读取原始字节,并且它们不会为您翻译。如果你不想要它们,你必须自己做翻译。

这是

由于标准库实现将标准窗口行结尾rn转换为标准 c++ 行结束n

正如@ipc所说,您可以使用此答案做您想做的事。(注意:根据评论,关于这个问题的公认答案实际上并不是最好的方法。

或者,您可以通过以二进制模式打开流来禁用行尾转换,如下所示:

std::ifstream t(fileName, std::ios_base::in | std::ios_base::binary);