Re: [問題] 如何在未讀檔前得知行數...

看板C_and_CPP (C/C++)作者 (sjgau)時間16年前 (2009/08/21 09:17), 編輯推噓12(12020)
留言32則, 6人參與, 最新討論串2/2 (看更多)
檔案有兩種,文字檔案和 二進位檔案。 文字檔案的 每一行,採用 0x0d + 0x0a 來分隔, 或者--不一定,但是一定會有 分行的控制字元。 文字檔案的每一行文字,長度不一, 所以,很難能夠在 不要讀檔之前,就判定行數。 如果是 二進位檔案,而且檔案格式固定, 就可以使用檔案的大小,除以每一筆資料的長度, 得到檔案裡面所存放的資料比數。 ※ 引述《meimiao (美妙)》之銘言: : 想要讀檔的時候已經malloc好記憶體空間 : 由於想要 malloc二維的矩陣空間 : 所以 想要先得知file的總行數 : 不知道有沒有已經有的函式可以使用呢?(使用c語言) : 不好意思 如果是個蠢問題的話 先謝謝大家>"< -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.245.110.241

08/21 09:25, , 1F
我要讀的就是每行不固定的文字檔>"< 因為不想要每次讀一行
08/21 09:25, 1F

08/21 09:26, , 2F
就malloc一次 這樣似乎會變成不同的陣列 而且一直讀檔感覺
08/21 09:26, 2F

08/21 09:26, , 3F
比較沒有效率 所以才想要一次做到好:(
08/21 09:26, 3F

08/21 09:51, , 4F
每行不固定, 你要怎麼malloc一次就解決?? 算行數順便計
08/21 09:51, 4F

08/21 09:52, , 5F
算找出最長字數, 然後都malloc成最大的那個??
08/21 09:52, 5F

08/21 09:53, , 6F
基本上先用fseek+ftell算出檔案大小, 然後用binary mode
08/21 09:53, 6F

08/21 09:54, , 7F
全讀回來在scan裡面的換行, 反正你確定是文字檔的話.
08/21 09:54, 7F

08/21 09:55, , 8F
不然就是先用get整行用的函數loop算行數, 然後開完陣列
08/21 09:55, 8F

08/21 09:56, , 9F
再重讀一遍XD PS. 文字檔不是一定用0d0a換行喔, Linux
08/21 09:56, 9F

08/21 09:57, , 10F
下記得只有0d(還是只有0a)而已, 所以用bin那招要注意:)
08/21 09:57, 10F

08/21 09:59, , 11F
0a
08/21 09:59, 11F

08/21 10:00, , 12F
對不起....Orz 我老搞不清楚哪個是return哪個是newline
08/21 10:00, 12F

08/21 10:00, , 13F
只知道對應\r\n....Orz
08/21 10:00, 13F

08/21 10:03, , 14F
沒關係.. 我也沒記起來過 Orz
08/21 10:03, 14F

08/21 10:06, , 15F
本來是想要malloc二維 先malloc出行再用迴圈malloc出個別
08/21 10:06, 15F

08/21 10:07, , 16F
的長度...二維陣列可以是不同長度嗎???@@
08/21 10:07, 16F

08/21 10:18, , 17F
你分兩維動態要來的每個維度想多長都是你自己決定的,
08/21 10:18, 17F

08/21 10:18, , 18F
只是比較少見這樣用的, 不小心很容易存取超過吧我猜.
08/21 10:18, 18F

08/21 10:22, , 19F
開buffer,讀檔進buffer,自己做一個表示行的結構,
08/21 10:22, 19F

08/21 10:23, , 20F
掃過buffer,把每一行的address抓出來,存在你的行結構
08/21 10:23, 20F

08/21 10:25, , 21F
意思是 一維陣列看待成兩維嗎?利用strstr找尋\n之類的??
08/21 10:25, 21F

08/21 10:25, , 22F
每一個行結構串起來,你就得到一整個文件的每個行的位置
08/21 10:25, 22F

08/21 10:40, , 23F
要搞這麼 dynamic 的話, 我覺得不如用 linked-list 吧
08/21 10:40, 23F

08/21 10:40, , 24F
那麼第一維就不必預先 malloc 了
08/21 10:40, 24F

08/21 10:41, , 25F
其實樓上的做法也不錯. 為了方便處理, 也可以找出所有
08/21 10:41, 25F

08/21 10:42, , 26F
newline 換成 null, 這麼每行就變成完整的 string 了
08/21 10:42, 26F

08/21 10:51, , 27F
謝謝 kaichan的方法好像蠻易了解的 感謝大家的幫忙!!!:D
08/21 10:51, 27F

08/21 11:00, , 28F
a大的方法不錯:) 要另外把string頭記起來就是了, 再看怎
08/21 11:00, 28F

08/21 11:00, , 29F
樣轉存array方便取用, 或者就這樣存著吧XD
08/21 11:00, 29F

08/22 13:47, , 30F
\r回車 \n換行,你把\r想像成印字頭回到要打第一個符的位置
08/22 13:47, 30F

08/22 18:54, , 31F
小弟知道\r\n是return/換行啦, 只是分別是0d0a哪一個,
08/22 18:54, 31F

08/22 18:54, , 32F
還有順序到底是什麼, 每次都搞不清楚....XD
08/22 18:54, 32F
文章代碼(AID): #1AZVN5N- (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1AZVN5N- (C_and_CPP)