[爆卦]c讀檔txt是什麼?優點缺點精華區懶人包

為什麼這篇c讀檔txt鄉民發文收入到精華區:因為在c讀檔txt這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者redonizuka (R大)看板C_and_CPP標題[問題] C++_動態陣列_讀檔時間We...

c讀檔txt 在 Point Chen 點點陳插畫事務所 Instagram 的最讚貼文

2021-08-18 10:18:12

電子書閱讀器分享| Kobo Libra H2O #非業配 在今年疫情變得越發嚴峻的五月中前,我絕對是紙本書籍的擁戴者,往往在博客來下單後沒兩天就能到手閱讀,方便又迅速,以致我從沒考慮過電子書。 疫情爆發後,隨著物流系統大爆炸,連24h pchome都變成240h了,在家閒得發慌想看點書,但出貨...


開發平台(Platform): QtCreator


問題(Question):利用動態陣列讀檔是否有達到動態效果? 以及如何驗證?


餵入的資料(Input): .txt
1 10
100 200
201 210
900 1000


預期的正確結果(Expected Output):
1 10
100 200
201 210
900 1000

錯誤結果(Wrong Output): None


程式碼(Code):(請善用置底文網頁, 記得排版)
#include <iostream>
#include <fstream>


using namespace std;

int main()
{
fstream file;
char *buffer = new char[300];

file.open("C:\\Users\\redon_000\\Desktop\\QT\\Uva_3n_add_1\\TestFile.txt",ios::in);

if(!file)
cout <<"The file didn't open"<<endl;
else
{
file.read(buffer,300);
cout <<buffer<<endl;
file.close();
}
delete [] buffer;
return(0);
}

補充說明(Supplement): 目前初學C++,依照書本上的讀檔,

是宣告一個死的陣列給他,但我想學習如何運用動態陣列,上面是讀整個檔案

若此問題解決,依行讀取也使用動態陣列,在記憶體配置上會來的有效率,

認真想學習,謝謝大家。


--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.120.101.186
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1407896080.A.784.html
redonizuka: 首先想知道這樣的寫法是有達到動態陣列嗎? 08/13 10:15
gride2: file.tellg(), then new char[xxx]. 08/13 11:15
redonizuka: 如果使用了file.tellg(),這樣的話其實也不用動態了 08/13 11:48
redonizuka: 因為她就直接回傳你資料長度了吧,除非你要分行讀 08/13 11:49
redonizuka: 這樣的解釋不知是對是錯? 08/13 11:49
lNishan: 這問題用動態陣列沒意義 08/13 12:43
lNishan: 如果你要memory efficient,一個一個字元讀+輸出就行了 08/13 12:44
lNishan: 如果一行一行讀,程式執行中占用最大的記憶體是 08/13 12:48
lNishan: sizeof(char)*(最長的字串長度+1) 08/13 12:49
lNishan: 如果已知最長是300,你就直接開300就好 08/13 12:50
lNishan: 不斷使用new、delete反而會消耗額外時間 08/13 12:50
redonizuka: lN大,若一行一行讀的話我也要先定義BUFFER的大小 08/13 12:52
redonizuka: 目前我已知的file.tellg()可知整份文件的長度 08/13 12:54
redonizuka: 但要取得最長字串的長度,有更明顯的提示嗎? 08/13 12:55
redonizuka: 我認同你上述的說法,若300那數字能在自動一點 08/13 12:56
redonizuka: 我就可以通用於任何TXT文件,請求指教 08/13 12:57
lNishan: 那你就每次都讀一個character就好 08/13 13:05
lNishan: 如果題目需要分行,那就用迴圈讀到換行字元 08/13 13:06
lNishan: 通常這類訊息(eg. 字串最長多少) 問題都會specify出來 08/13 13:18
lNishan: 或是你寫好程式,自己Specify出來 08/13 13:20
gride2: 我不太清楚你的真正目的為何? 如果單純要輸出每行 08/13 13:40
gride2: 可使用getline(),再cout出去就好 08/13 13:42
gride2: 如果照你說的你也不知道每行長度為多少 08/13 13:45
gride2: 一直使用new/delete,只要你不會memory leak又不怕費時 08/13 13:46
gride2: 因為我一直以為你想要知道長度...所以前面就回那些.. 08/13 13:47

那我再重新重整一下我的問題:

在讀檔的時候,不管是讀整個,或者是分行讀

都要先 char buffer[x] ,其中 x 基本上採最簡單的方式是直接給他一個值

但若直接給值的話,假使文件內容大於這個值,會發生錯誤,

但值給太大又會浪費掉資源,所以才想要詢問說能否讓這個x自動隨著文件做改變

gride2大提供的file.tellg(),可以在讀整份文件時自動提供這個x

所以有回答到我的問題,而後衍生出說那我要讀分行的話,那個x如何取得的問題?

一開始直接聯想到動態是想說給了動態連結,即使我x給大他也會動態校正,

但經討論後發現我設想不周詳。抱歉,初學C++,讀檔是蠻重要的一環

所以問得比較細,真心想學好。回到問題

目前分行讀取上,若使用getline()的話,你仍要先設char buffer[x],

那這個x值有辦法自動取得嗎? Nishan大,你提到的那方法有更具體的範例嗎?
※ 編輯: redonizuka (140.120.101.186), 08/13/2014 14:38:07
bibo9901: 不曉得你的"自動取得"指的是什麼? 08/13 15:14
gride2: getline()可以用string吧? 08/13 15:17
bibo9901: 因為不可能預知檔案的一行有多少字元, 所以你如果不喜歡 08/13 15:17
bibo9901: 在編譯時決定長度, 就只能在執行的時候邊讀取邊調整了, 08/13 15:18
bibo9901: getline + string + shink_to_fit 應該很滿足你的需求 08/13 15:18
gride2: 如果以你這個方向,面對未知長度,我習慣是先用char *buf 08/13 15:23
gride2: 不過看你的code也沒有要去變更buffer[n]的值,單純的輸出 08/13 15:24
gride2: 其實使用getline(file,string)即可,不要限制在buffer[x] 08/13 15:26
gride2: 頂多很多此一舉的就是string讀完後,再依據string的lenth 08/13 15:27
gride2: 去宣告char buffer的size 08/13 15:28
redonizuka: OK,了解,感謝大家,我受益良多 08/15 18:22

你可能也想看看

搜尋相關網站