【发布时间】:2012-11-29 20:33:51
【问题描述】:
使用此代码,我从文件中读取了一个字符串。
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 个字节,因此我的字符串看起来很奇怪。我该如何避免这种情况?
【问题讨论】:
-
这可能是因为 CRLF Windows 样式的行尾,而字符串只包含 CR...
-
从 C++11 开始,您可以使用
&s[0]直接读入string,并且它可以在一些 C++11 之前的实现(如 MSVC)中实际工作。 -
@ybungalobill 是
s一个字符串吗? -
@AtoMerZ:是的。假设你
resized当然是正确的......关键是现在保证它在内存中是连续的,并且禁止写入时复制。所以现在这样做是安全的。 编辑啊,MSVC10 调试 CRT 也引入了一个错误,该错误会在索引到字符串的末尾元素时触发断言(尽管标准允许这样做)。所以只有size() > 0.