Re: [問題] 如何知道一個檔案有幾行

看板C_and_CPP作者 (元丁)時間11年前 (2014/02/01 17:54), 編輯推噓4(407)
留言11則, 7人參與, 最新討論串3/4 (看更多)
小弟學C不久,非資工人, 正在寫一個小程式需要讀數十行,每行字元十個左右的資料。 想瞭解BUF_size大約要怎麼取, 小小測試了一下, 我使用動態記憶體配製決定BUF_SIZE的大小(用for迴圈跑), 並算出line_cut。 ※ 引述《tropical72 (藍影)》之銘言: : -------- : step1 : 產生測試資料 : (1) 固定產生一 LINE_CNT 行之檔案 : (2) 第 i 行之字元數,限定為 100~2000 字元,以 rand 決定 : (3) 每個字元產生方式: rand() % 26 + 'a' : 程式碼大概長這樣 : int i, j, k; : FILE *fp=fopen(FILENAME, "w"); : srand(0); // 不同電腦、相同compiler產生結果一樣 : for(i=0; i!=LINE_CNT; ++i){ // 產生 LINE_CNT 行 : j = rand() % 1901 + 100; // 第 i 行產生 j 個 a~z, j: [100, 2000] 小弟用% 5 + 5 : for(k=0; k!=j; ++k) fputc(rand()%26 + 'a', fp); : fputc('\n', fp); : } : fclose(fp); : ※ 實際設 LINE_CNT = 200 萬, 產生大小約 1.93 GB 小弟設 150行("Orz) : -------- : step 3: 以 fgets 進行 計算結果輸出為line_cnt3 : ---------- : step 4: 用 fread 進行 計算結果輸出為line_cnt4 : ※ 用 fread 比 fgets 好的地方在於,每次必抓 BUF_SIZE 這麼多字, : ※ 若每行只有十幾二十個字,用 fgets 還是要分很多次抓取 這似乎就要看BUF_SIZE的大小… : ----------- : Result : 我使用code block,GCC 取BUF_SIZE 2~50 輸出結果如下 size=2, line_cnt4=149, line_cnt3=1203 size=3, line_cnt4=150, line_cnt3=630 size=4, line_cnt4=149, line_cnt3=454 size=5, line_cnt4=149, line_cnt3=361 size=6, line_cnt4=149, line_cnt3=300 size=7, line_cnt4=149, line_cnt3=269 size=8, line_cnt4=149, line_cnt3=238 size=9, line_cnt4=149, line_cnt3=211 size=10, line_cnt4=149, line_cnt3=185 size=11, line_cnt4=149, line_cnt3=150 size=12, line_cnt4=149, line_cnt3=150 size=13, line_cnt4=149, line_cnt3=150 size=14, line_cnt4=148, line_cnt3=150 size=15, line_cnt4=149, line_cnt3=150 size=16, line_cnt4=149, line_cnt3=150 size=17, line_cnt4=148, line_cnt3=150 size=18, line_cnt4=148, line_cnt3=150 size=19, line_cnt4=149, line_cnt3=150 size=20, line_cnt4=149, line_cnt3=150 size=21, line_cnt4=149, line_cnt3=150 size=22, line_cnt4=148, line_cnt3=150 size=23, line_cnt4=149, line_cnt3=150 size=24, line_cnt4=149, line_cnt3=150 size=25, line_cnt4=149, line_cnt3=150 size=26, line_cnt4=149, line_cnt3=150 size=27, line_cnt4=148, line_cnt3=150 size=28, line_cnt4=146, line_cnt3=150 size=29, line_cnt4=148, line_cnt3=150 size=30, line_cnt4=149, line_cnt3=150 size=31, line_cnt4=146, line_cnt3=150 size=32, line_cnt4=147, line_cnt3=150 size=33, line_cnt4=148, line_cnt3=150 size=34, line_cnt4=148, line_cnt3=150 size=35, line_cnt4=148, line_cnt3=150 size=36, line_cnt4=148, line_cnt3=150 size=37, line_cnt4=147, line_cnt3=150 size=38, line_cnt4=146, line_cnt3=150 size=39, line_cnt4=146, line_cnt3=150 size=40, line_cnt4=149, line_cnt3=150 size=41, line_cnt4=148, line_cnt3=150 size=42, line_cnt4=146, line_cnt3=150 size=43, line_cnt4=145, line_cnt3=150 size=44, line_cnt4=148, line_cnt3=150 size=45, line_cnt4=146, line_cnt3=150 size=46, line_cnt4=149, line_cnt3=150 size=47, line_cnt4=146, line_cnt3=150 size=48, line_cnt4=149, line_cnt3=150 size=49, line_cnt4=146, line_cnt3=150 size=50, line_cnt4=149, line_cnt3=150 若一行的字元數愈少,step4的方法愈不穩定(易受size影響) 只要bufsize一改,這個方法算出來的結果就會不同? 說實在話我不知道為什麼,也想不出來為什麼"Orz 所以,若要像我讀小筆資料,step3的方法似乎是比較適當的。 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.233.64.214

02/02 10:27, , 1F
exec wc (誤)
02/02 10:27, 1F

02/02 12:16, , 2F
wc -l XD
02/02 12:16, 2F

02/02 13:19, , 3F
其實我看不懂XD,只是我常是在windos下,linux的我還不懂
02/02 13:19, 3F

02/02 13:54, , 4F
你如果不想寫動態擴充陣列的話
02/02 13:54, 4F

02/02 13:55, , 5F
就讀兩次 第一次算/n數量 第二次讀資料
02/02 13:55, 5F

02/02 18:00, , 6F
要不要把你程式碼拿來看一下? 為什麼結果會錯 XD
02/02 18:00, 6F

02/02 18:01, , 7F
我覺得是你哪裡寫錯了. 這些作法應該沒有穩定性的問題.
02/02 18:01, 7F

02/02 18:02, , 8F
除了 step3
02/02 18:02, 8F

02/02 18:38, , 9F
小檔案我覺得用 fgets 就夠了
02/02 18:38, 9F

02/02 18:40, , 10F
找了一下這篇原文,附上 #1DyUBD7Q (C_and_CPP)
02/02 18:40, 10F

02/02 19:37, , 11F
step4的寫法有問題,要稍做修改; 否則當然會出錯,對只是運氣好.
02/02 19:37, 11F
文章代碼(AID): #1IxJJ2DJ (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1IxJJ2DJ (C_and_CPP)