c語言讀取每一行,再將符合條件的寫入另一個文件中。

已經很久沒有碰過c語言了,可能很多同學都覺得so easy。重新拾起來還是有點害怕&激動。

拾起來的時候犯了很多新手會返的錯誤,對不起大學老師了。╮( ̄▽ ̄")╭


寫這玩意的原因是開發扔了一份gc.log給我,打出來的是詳細信息,

比如:

<span style="font-family:Comic Sans MS;">2015-10-29T20:16:13.757+0800: 4.237: [GC [PSYoungGen: 1280000K->25644K(1493312K)] 1280000K->25644K(4906688K), 0.0096300 secs] [Times: user=0.05 sys=0.04, real=0.01 secs] 
Total time for which application threads were stopped: 0.0098530 seconds
Application time: 0.0020110 seconds
Total time for which application threads were stopped: 0.0001470 seconds
Application time: 0.0000300 seconds
Total time for which application threads were stopped: 0.0002440 seconds
Application time: 0.0000300 seconds
Total time for which application threads were stopped: 0.0001120 seconds
Application time: 0.0000540 seconds
Total time for which application threads were stopped: 0.0001960 seconds
Application time: 0.0000270 seconds
Total time for which application threads were stopped: 0.0000570 seconds
Application time: 0.0000420 seconds
Total time for which application threads were stopped: 0.0001250 seconds
Application time: 0.0000290 seconds
Total time for which application threads were stopped: 0.0001090 seconds
Application time: 0.0000270 seconds</span>


但是我可能不太需要具體的線程停止的時間,比如:

<span style="font-family:Comic Sans MS;">2015-10-31T23:03:46.204+0800: 182856.684: [GC [PSYoungGen: 1355299K->309811K(1237120K)] 4059775K->3237002K(4650496K), 0.0469180 secs] [Times: user=0.46 sys=0.00, real=0.04 secs] 
2015-10-31T23:05:42.228+0800: 182972.708: [GC [PSYoungGen: 1237107K->260369K(1556288K)] 4164298K->3369121K(4969664K), 0.0405320 secs] [Times: user=0.39 sys=0.00, real=0.04 secs] 
2015-10-31T23:07:17.002+0800: 183067.482: [GC [PSYoungGen: 1166225K->129644K(1014848K)] 4274977K->3449210K(4428224K), 0.0350170 secs] [Times: user=0.34 sys=0.00, real=0.04 secs] 
2015-10-31T23:07:17.037+0800: 183067.517: [Full GC [PSYoungGen: 129644K->0K(1014848K)] [PSOldGen: 3319566K->2020541K(3413376K)] 3449210K->2020541K(4428224K) [PSPermGen: 134284K->134284K(216000K)], 0.8718420 secs] [Times: user=0.87 sys=0.00, real=0.87 secs] 
2015-10-31T23:09:00.015+0800: 183170.495: [GC [PSYoungGen: 885175K->88131K(1529152K)] 2905716K->2108673K(4942528K), 0.0110240 secs] [Times: user=0.10 sys=0.00, real=0.01 secs] </span><span style="font-family:Microsoft YaHei;">
</span>


所以就想自己從開發給予的格式轉換到當前想要的格式。
OK,正常的思路就是讀取文件中的每一行,當行首字爲數字(“2”)時,將這行讀到新創建的文件中。

其實很簡單有木有。然而我還是寫了兩個小時。我有罪。

先介紹一下使用到的函數。

fopen (FILE *filename)/fclose(FILE *filename)

顧名思義就是打開文件了。

有打開就有關閉。它們是一對好基友。☺

這邊只要注意打開可能會不成功,那麼愉快地加上一個判斷條件,爲空就提示“Error!”。

<span style="font-family:Comic Sans MS;">if((NULL == fr)||(NULL == fw) ) </span>


feof(FILE *filename)

用來檢查流上的文件是否結束了。是一個結束的標識符end-of-file。

如果有過acm經驗的小夥伴一定對EOF很熟悉。

<span style="font-family:Comic Sans MS;font-size:10px;">while (scanf("%d",&n),n!=EOF) //while(scanf("%d",&n)!=EOF)</span>
如果文件結束,則返回非0值,否則返回0。

可能會問:feof()可以用EOF代替嗎?

不可以哦。fgetc返回-1時,有兩種情況:讀到文件結尾或是讀取錯誤。因此我們無法確信文件已經結束, 因爲可能是讀取錯誤!

這時我們需要feof()。


fgets(char buf, int bufsize, FILE *filename)

從文本結構體指針stream中讀取數據,每次讀取一行。

讀取的數據保存在buf指向的字符數組中,每次最多讀取bufsize-1個字符(第bufsize個字符賦'\0').

如果文件中的該行,不足bufsize個字符,則讀完該行就結束。

如若該行(包括最後一個換行符)的字符數超過bufsize-1,則fgets只返回一個不完整的行,但是,緩衝區總是以NULL字符結尾,對fgets的下一次調用會繼續讀該行

函數成功將返回buf,失敗或讀到文件結尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函數是否是出錯而終止的,應該藉助feof函數或者ferror函數來判斷。


int  isdigit()

判斷是不是數字,是數字返回非零值;不是數字返回零。

by the way, #include <ctype.h>這個下面有好多好東西。像我那麼挫的,一開始想用strcmp去比較讀取的行首字是不是數字,結果顯示沒有isdigit好用。


fputs(char buf, FILE *filename)

讀取判斷都完成之後需要去寫入,不是很難。

實際上這樣就完成了,但是我想充分利用一下開發的數據,統計了每次有多少線程因爲GC停止。

實際的代碼如下所示:

<span style="font-family:Comic Sans MS;">#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
    FILE *fr, *fw;
    int i = 0;
    char filername[] = "E:\\document\\gc.log"; //文件名
    char filewname[] = "E:\\document\\gc-w.log"; //文件名
    char strLine[1024];  //每行最多讀取的字符數 
    int str = -1;
    fr = fopen(filername, "r");
    fw = fopen(filewname, "wt+");    
    if((NULL == fr)||(NULL == fw) )  //判斷文件可讀性 
    {
            printf("ERROR!\n");
            return -1; 
    } 
    
    while(!feof(fr)) 
    {
            i++;
            fgets(strLine, 1024, fr);//讀取每一行
            //printf("%s\n",strLine); 
            str = isdigit(strLine[0]);
            //printf("str is %d\n",str);
           if (0 != str)
            {
               printf("i is %d\n",i);
               fputs(strLine, fw);
               //fprintf(fw,"%d threads are stopped\n", i);
               i = 0;
            }
         
    }
    fclose(fr); //關閉文件 
    fclose(fw);
    system("pause");
    return 0;
} </span>

還有一些讀寫文件的其他函數和文件模式,可以參考http://www.cnblogs.com/Romi/archive/2012/02/29/2374769.html







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章