看板 C_and_CPP 關於我們 聯絡資訊
小弟學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
lc85301:exec wc (誤) 02/02 10:27
Bencrie:wc -l XD 02/02 12:16
gary8520:其實我看不懂XD,只是我常是在windos下,linux的我還不懂 02/02 13:19
fireslayer:你如果不想寫動態擴充陣列的話 02/02 13:54
fireslayer:就讀兩次 第一次算/n數量 第二次讀資料 02/02 13:55
Feis:要不要把你程式碼拿來看一下? 為什麼結果會錯 XD 02/02 18:00
Feis:我覺得是你哪裡寫錯了. 這些作法應該沒有穩定性的問題. 02/02 18:01
Feis:除了 step3 02/02 18:02
tropical72:小檔案我覺得用 fgets 就夠了 02/02 18:38
tropical72:找了一下這篇原文,附上 #1DyUBD7Q (C_and_CPP) 02/02 18:40
yvb:step4的寫法有問題,要稍做修改; 否則當然會出錯,對只是運氣好. 02/02 19:37