使用FILE結構操作文本文件

Again vexed, also do not forget to smile; again anxious, also should pay attention to the tone; again bitter, also do not forget to insist; again tired, also want to love yourself.
再煩,也別忘微笑;再急,也要注意語氣;再苦,也別忘堅持;再累,也要愛自己。

小編不得不說學好文件對於C語言的提升很有幫助,想玩好C語言就得把文件拿下哦。當然前面的基礎也要打好,關於文件的函數也較多,不用刻意去記,但要知道有那些用法。

任務描述
本關要求編寫函數ext\fractDigit,該函數從已有的當前目錄下的文件a.txt中讀取並解析出其中的數值,並將結果寫到當前目錄下的文件b.txt中。
其中:文件a.txt中包含各種字符,但只有數字字符是有效的,提取其中的數字字符,將每3個數字組成一個整數,寫到文件b.txt中,每個整數之間用一個空格分開。讀取過程中,如果a.txt中最後剩下不到3個數字字符,則將剩下的1個或者2個數字字符組成一個整數。

例如:a.txt中的內容是1j3j5sd0msd454ss3msd563,則抽取出來寫入文件b.txt的內容應該是135 45 435 63(第二個整數是由045三個數字組成,所以是45)。

編程要求
編程任務是補全step1/fileTxt.c文件中ext\fractDigit函數,以實現使用FILE結構來操作文本文件的要求。具體要求如下:
本關要求通過補全step1/fileTxt.c文件中ext\fractDigit函數來實現從已有的當前目錄下的文件a.txt中讀取並解析出其中的數值,並將結果寫到當前目錄下的文件b.txt中的要求。

輸入:q12h44h67k854ksd923823sf83wd38457sd433ds,
輸出:124 467 854 923 823 833 845 743 3
輸入:1212121212343434343445454545450000005656565665dfsd455
輸出:121 212 121 234 343 434 344 545 454 545 0 0 565 656 566 545 5

本題需要注意的是輸入的0是有變化的,如045就變成了45,000則只有一個一個0打印出來。

源代碼:

#include <stdio.h>
#include <stdlib.h>
//聲明外部函數,函數extractDigit在其它源文件中實現
extern void extractDigit();

int main()
{
    //準備文件a.txt的內容
    FILE *fp = fopen("a.txt","w");  //打開文件a.txt用於寫
    char s[1000];
    fgets(s, 999, stdin);  //從鍵盤讀取一行字符
    fputs(s,fp);  //將這一行字符寫入文件a.txt中
    fclose(fp);   //關閉fp關聯的文件a.txt
    extractDigit();  //調用函數,抽取數字寫入文件b.txt中
    FILE *f = fopen("b.txt","r");  //以讀的方式打開文件b.txt
    if(f==NULL)  //打開失敗則返回
        return 0;
    int n,k=0;
    fscanf(f,"%d",&n);  //從文件b.txt中讀出一個整數到變量n中
    while(!feof(f))  //如果文件沒結束(讀出的不是EOF)
    {
        k++;
        printf("%d ",n);  //輸出該整數到屏幕
        if(k%10==0)   //每十組一換行
            printf("\n");
        fscanf(f,"%d",&n);  //讀取下一個整數
    }
    if(k%10!=10)  //最後一行沒有換行符則補上
        printf("\n");
    return 0;
}
// 函數extractDigit的功能:從文件a.txt中提取數值寫入文件b.txt中
void extractDigit()
{
    FILE *fi = fopen("a.txt","r");  // 以讀的方式打開文件a.txt
    FILE *fo = fopen("b.txt","w");  // 以寫的方式打開文件b.txt
    if(fi==NULL || fo==NULL)  // 如果某個文件打開失敗,則返回
        return;
    char readADigit(FILE *fi)// 從文件讀取一個字符
{
        char c = fgetc(fi);
        if(c==EOF)
        {
            return EOF;
        }
        while(c>'9' || c<'0')// 如果不是數字字符,則繼續讀取下一個字符
        {
            c = fgetc(fi);
            if(c==EOF)
            {
                return EOF;
            }
        }
        return c;
    }
    char c;
    int num=0,k=0;
    c = readADigit(fi);// 從文件讀取一個字符
    while(c!=EOF)
    {
        num=num*10+c-'0';// 計算數字字符構成的整數
        k++;
        if(k==3)
        {
            fprintf(fo,"%d ",num);
            k=0;
            num=0;
        }
        c = readADigit(fi);
    }
    if(k!=0)// 如果有不到三位的數值,則寫入文件b.txt
    {
        fprintf(fo,"%d ",num);
    }
    fclose(fi);  // 關閉文件fi
    fclose(fo);  // 關閉文件fo
}

運行結果:
在這裏插入圖片描述
最後的話:刷題要找自己的不足,然後去專攻。

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