Re: [問題] 如何知道一個檔案有幾行
小弟學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
02/02 10:27, 1F
推
02/02 12:16, , 2F
02/02 12:16, 2F
→
02/02 13:19, , 3F
02/02 13:19, 3F
推
02/02 13:54, , 4F
02/02 13:54, 4F
→
02/02 13:55, , 5F
02/02 13:55, 5F
→
02/02 18:00, , 6F
02/02 18:00, 6F
→
02/02 18:01, , 7F
02/02 18:01, 7F
→
02/02 18:02, , 8F
02/02 18:02, 8F
→
02/02 18:38, , 9F
02/02 18:38, 9F
→
02/02 18:40, , 10F
02/02 18:40, 10F
推
02/02 19:37, , 11F
02/02 19:37, 11F
討論串 (同標題文章)