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

楼主: out99 ( )   2015-05-19 03:56:41
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
我想要一次将整个档案读进 std::string
而不是用 while 一行一行读取再 append string
我直接使用 std::getline() 第三个参数 delim 丢入 '\0' 处理
测试过几个档案“看起来”没有问题
我想问的是会不会有特殊情形导致这个方式读出来的内容是错误的?
直接假设“档案的第一个 '\0' 字符就是整个档案的结尾”是正确的吗?
谢谢
喂入的资料(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):
作者: Feis (永远睡不着 @@)   2015-05-19 08:32:00
'\0' 当然不是档案结尾 (EOF)
作者: TobyH4cker (Toby (我要当好人))   2015-05-19 09:47:00
档案结尾才是档案结尾
作者: longlongint (华哥尔)   2015-05-19 10:05:00
读纯文字档勉强可以
作者: Killercat (杀人猫™)   2015-05-19 13:25:00
错的,你的假设要在档案是ascii才成立,binary会死另外不要用std::string读binary...我想应该不用提醒binary实务上都用vector<unsigned char>比较多或者unsigned char[]/char[](低阶点)都可以确定没有随机读取需求的话 list<unsigned char>
作者: dirkc (3781615)   2015-05-23 00:11:00
通常先计算档案大小再一次读入会比getline,iterator,或是streambuf的方式都要快如果速度不需要考虑就无所谓text模式的开档可以用stat(_stat for windows)取得st_size代表档案大小size,然后str.reserve(size),然后再用istream::read(&str[0],size)一次读入写错,不是reserve,是resize

Links booklink

Contact Us: admin [ a t ] ucptt.com