Re: [问题] C++ 将档案读入 std::string

楼主: scwg ( )   2015-05-19 10:14:22
※ 引述《out99 ( )》之铭言:
: 开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
: VC++
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: 问题(Question):
: 我想要一次将整个档案读进 std::string
: 而不是用 while 一行一行读取再 append string
: 我直接使用 std::getline() 第三个参数 delim 丢入 '\0' 处理
: 测试过几个档案“看起来”没有问题
: 我想问的是会不会有特殊情形导致这个方式读出来的内容是错误的?
你底下假设要读的是 ASCII 档, 用 '\0' 当 delimiter 应该不会有问题.
: 直接假设“档案的第一个 '\0' 字符就是整个档案的结尾”是正确的吗?
这个假设并非对所有档案都成立.
例如执行档里面要存字串常数就会以 '\0' 结尾, 而非档尾.
ASCII 档用 '\0' 当 delimiter 之所以会读进整个档不是因为“读到第一个 '\0'
字符”, 而是“直到档尾都还没读到 '\0' 所以回传目前读到的部份”.
要对所有档案都通用可以参考
http://stackoverflow.com/questions/2602013
第二个答案:
std::stringstream buffer;
buffer << fin.rdbuf();
str = buffer.str();
: 谢谢
: 喂入的资料(Input):
: 内容为 ASCII 字符,不包含其它特殊字符的文字档。
: 预期的正确结果(Expected Output):
: 错误结果(Wrong Output):
: 程式码(Code):(请善用置底文网页, 记得排版)
: #include <iostream>
: #include <string>
: #include <fstream>
: using namespace std;
: int main(int argc, char** argv)
: {
: string str;
: ifstream fin(argv[1], ios::in);
: if (fin.fail())
: return 1;
: getline(fin, str, '\0');
: fin.close();
: cout << str;
: return 0;
: }
: 补充说明(Supplement):
作者: out99 ( )   2015-05-19 14:37:00
我会去试试看的,感谢!
作者: anyoiuo   2015-05-21 11:31:00
推答案1第二个答案似乎受限于stream buff的默认大小(推测)
楼主: scwg ( )   2015-05-21 12:10:00
@anyoiuo: 应该不会. streambuf 会做 buffered input, << 会尽量读进来, underflow() 的时候 base_filebuf 会去读档, 所以应该无论如何会读到档尾, 除非 stringstream 用光内存

Links booklink

Contact Us: admin [ a t ] ucptt.com