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);
相关文章:
- 为什么缓冲区的内容在读取空 rdbuf 时被删除?
- rdbuf()->str()在哪里?
- 为什么cin.rdbuf()->sbumpc()在循环中只要求我输入一次?
- 当我使用fs.rdbuf()复制文件时,我会丢失一些数据
- 什么目的地<<源.rdbuf();在做什么?为什么太多的开盘关闭
- 是否可以更改 ostringstream rdbuf?
- rdbuf() 阅读垃圾
- stringstream->rdbuf()->pubsetbuf 未设置缓冲区
- std::stringstream类和rdbuf()成员函数
- 为什么rdbuf()不打印任何内容
- rdbuf()奇怪的行为
- 使用 RDBUF 将文件内容复制到缓冲区失败
- stringstream.rdbuf 导致 cout 失败
- 由于cout<<cin.rdbuf()导致的无限循环,为什么?
- << s.str() 和 << s.rdbuf() 之间的区别
- RDBUF vs Getline vs ">>"
- openfoam: flex yyin.rdbuf(std::cin.rdbuf() error
- 为什么 ofstream::rdbuf() 总是为空
- 使用str()和rdbuf()打印字符串流
- 使用rdbuf复制流在空输入时失败