2020年05月12日 23:01 __ _ _ _ _

文章配图

**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}

运行结果:

文章配图

文章配图

最后的话:刷题要找自己的不足,然后去专攻。

往期推荐:

学计算机,还不知道数据编码?你OUT了 2020-05-10
文章配图

2020年5月编程排行榜:C语言反超Java夺冠 2020-05-05
文章配图

文件读取和写入

2020-05-09


文章配图

公众号:程序员Bob

一个正在学习C语言的人,致力于将C讲得更透彻!

点赞关注谢谢你

长按下图二维码关注,和你一起领悟程序员的魅力。

文章配图

点“ 在看 ” 你懂得

文章配图

预览时标签不可点

阅读




__