[問題] C++_動態陣列_讀檔

看板C_and_CPP作者 (R大)時間11年前 (2014/08/13 10:14), 11年前編輯推噓0(0036)
留言36則, 4人參與, 最新討論串1/2 (看更多)
開發平台(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

08/13 10:15, , 1F
首先想知道這樣的寫法是有達到動態陣列嗎?
08/13 10:15, 1F

08/13 11:15, , 2F
file.tellg(), then new char[xxx].
08/13 11:15, 2F

08/13 11:48, , 3F
如果使用了file.tellg(),這樣的話其實也不用動態了
08/13 11:48, 3F

08/13 11:49, , 4F
因為她就直接回傳你資料長度了吧,除非你要分行讀
08/13 11:49, 4F

08/13 11:49, , 5F
這樣的解釋不知是對是錯?
08/13 11:49, 5F

08/13 12:43, , 6F
這問題用動態陣列沒意義
08/13 12:43, 6F

08/13 12:44, , 7F
如果你要memory efficient,一個一個字元讀+輸出就行了
08/13 12:44, 7F

08/13 12:48, , 8F
如果一行一行讀,程式執行中占用最大的記憶體是
08/13 12:48, 8F

08/13 12:49, , 9F
sizeof(char)*(最長的字串長度+1)
08/13 12:49, 9F

08/13 12:50, , 10F
如果已知最長是300,你就直接開300就好
08/13 12:50, 10F

08/13 12:50, , 11F
不斷使用new、delete反而會消耗額外時間
08/13 12:50, 11F

08/13 12:52, , 12F
lN大,若一行一行讀的話我也要先定義BUFFER的大小
08/13 12:52, 12F

08/13 12:54, , 13F
目前我已知的file.tellg()可知整份文件的長度
08/13 12:54, 13F

08/13 12:55, , 14F
但要取得最長字串的長度,有更明顯的提示嗎?
08/13 12:55, 14F

08/13 12:56, , 15F
我認同你上述的說法,若300那數字能在自動一點
08/13 12:56, 15F

08/13 12:57, , 16F
我就可以通用於任何TXT文件,請求指教
08/13 12:57, 16F

08/13 13:05, , 17F
那你就每次都讀一個character就好
08/13 13:05, 17F

08/13 13:06, , 18F
如果題目需要分行,那就用迴圈讀到換行字元
08/13 13:06, 18F

08/13 13:18, , 19F
通常這類訊息(eg. 字串最長多少) 問題都會specify出來
08/13 13:18, 19F

08/13 13:20, , 20F
或是你寫好程式,自己Specify出來
08/13 13:20, 20F

08/13 13:40, , 21F
我不太清楚你的真正目的為何? 如果單純要輸出每行
08/13 13:40, 21F

08/13 13:42, , 22F
可使用getline(),再cout出去就好
08/13 13:42, 22F

08/13 13:45, , 23F
如果照你說的你也不知道每行長度為多少
08/13 13:45, 23F

08/13 13:46, , 24F
一直使用new/delete,只要你不會memory leak又不怕費時
08/13 13:46, 24F

08/13 13:47, , 25F
因為我一直以為你想要知道長度...所以前面就回那些..
08/13 13:47, 25F
那我再重新重整一下我的問題: 在讀檔的時候,不管是讀整個,或者是分行讀 都要先 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

08/13 15:14, , 26F
不曉得你的"自動取得"指的是什麼?
08/13 15:14, 26F

08/13 15:17, , 27F
getline()可以用string吧?
08/13 15:17, 27F

08/13 15:17, , 28F
因為不可能預知檔案的一行有多少字元, 所以你如果不喜歡
08/13 15:17, 28F

08/13 15:18, , 29F
在編譯時決定長度, 就只能在執行的時候邊讀取邊調整了,
08/13 15:18, 29F

08/13 15:18, , 30F
getline + string + shink_to_fit 應該很滿足你的需求
08/13 15:18, 30F

08/13 15:23, , 31F
如果以你這個方向,面對未知長度,我習慣是先用char *buf
08/13 15:23, 31F

08/13 15:24, , 32F
不過看你的code也沒有要去變更buffer[n]的值,單純的輸出
08/13 15:24, 32F

08/13 15:26, , 33F
其實使用getline(file,string)即可,不要限制在buffer[x]
08/13 15:26, 33F

08/13 15:27, , 34F
頂多很多此一舉的就是string讀完後,再依據string的lenth
08/13 15:27, 34F

08/13 15:28, , 35F
去宣告char buffer的size
08/13 15:28, 35F

08/15 18:22, , 36F
OK,了解,感謝大家,我受益良多
08/15 18:22, 36F
文章代碼(AID): #1JwieGU4 (C_and_CPP)
文章代碼(AID): #1JwieGU4 (C_and_CPP)