[問題] C++ 將檔案讀入 std::string

看板C_and_CPP作者 ( )時間10年前 (2015/05/19 03:57), 10年前編輯推噓1(1014)
留言15則, 5人參與, 最新討論串1/3 (看更多)
開發平台(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): -- □ (本文已被吃掉) 吃光光,口卡口卡 □ (本文已被吃掉) □ (本文已被吃掉) ▼▼▼▼ □ (本文已被吃掉) ▲▲▲▲ □ (本文已被吃掉) ) )).. □ (本文已被吃掉) ( ︶ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.43.202.159 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1431979023.A.DD3.html ※ 編輯: out99 (114.43.202.159), 05/19/2015 03:59:32 ※ 編輯: out99 (114.43.202.159), 05/19/2015 04:01:10

05/19 08:32, , 1F
'\0' 當然不是檔案結尾 (EOF)
05/19 08:32, 1F

05/19 09:47, , 2F
檔案結尾才是檔案結尾
05/19 09:47, 2F

05/19 10:05, , 3F
讀純文字檔勉強可以
05/19 10:05, 3F

05/19 13:25, , 4F
錯的,你的假設要在檔案是ascii才成立,binary會死
05/19 13:25, 4F

05/19 13:25, , 5F
另外不要用std::string讀binary...我想應該不用提醒
05/19 13:25, 5F

05/19 13:26, , 6F
binary實務上都用vector<unsigned char>比較多
05/19 13:26, 6F

05/19 13:26, , 7F
或者unsigned char[]/char[](低階點)都可以
05/19 13:26, 7F

05/19 13:27, , 8F
確定沒有隨機讀取需求的話 list<unsigned char>
05/19 13:27, 8F
目前需求沒有要用binary讀檔,感謝建議! ※ 編輯: out99 (114.37.157.70), 05/19/2015 14:36:22

05/23 00:11, , 9F
通常先計算檔案大小再一次讀入會比getline,iterator,或是
05/23 00:11, 9F

05/23 00:12, , 10F
streambuf的方式都要快
05/23 00:12, 10F

05/23 00:12, , 11F
如果速度不需要考慮就無所謂
05/23 00:12, 11F

05/23 01:39, , 12F
text模式的開檔可以用stat(_stat for windows)取得st_size
05/23 01:39, 12F

05/23 01:41, , 13F
代表檔案大小size,然後str.reserve(size),然後再用istream:
05/23 01:41, 13F

05/23 01:42, , 14F
:read(&str[0],size)一次讀入
05/23 01:42, 14F

05/23 02:49, , 15F
寫錯,不是reserve,是resize
05/23 02:49, 15F
文章代碼(AID): #1LMaGFtJ (C_and_CPP)
文章代碼(AID): #1LMaGFtJ (C_and_CPP)