1

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

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 需要 a char*not a string
因此,在问我的实际问题之前,如果有人知道从可能包含空格字符的文件中读取字符串的更好方法,请告诉我(直到 eof 才循环)。

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

但是我得到的是:
blah blah blah
blah blah in a new line═</p>

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

4

2 回答 2

2

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

于 2012-11-29T20:45:58.597 回答
1

这是由于标准库实现将标准 windows 行结尾\r\n转换为标准 c++ 行结尾\n

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

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

std::ifstream t(fileName, std::ios_base::in | std::ios_base::binary);
于 2012-11-29T20:45:34.500 回答