rdbuf()阅读垃圾

时间:2012-11-29 20:33:51

标签: c++ file fstream

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

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)。

文件内容为:
等等等等等等 blah blah in a new line

但我得到的是:
等等等等等等 blah blah in new lines =

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这是由于标准库实现将标准窗口行结束\r\n转换为结束\n的标准c ++行。

正如@ipc所说,你可以使用this answer做你想做的事。 (注意:根据评论,对该问题的接受答案实际上并不是最好的方法。)

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

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