[問題] 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