把文本文件中内容以行的方式读出,可以跳过空格等字符

本文详细解析了使用C语言通过文件指针进行文件读取操作,并展示了如何将读取的内容按照换行符分割成多行文本,进一步处理并输出每行内容。

#include <stdio.h>
#include <memory.h>
#include <stdlib.h>


int main()
{
  char *filename="c://filelist.txt";
  FILE *fp;
  fp=fopen(filename,"r");
 
  if(!fp){
     printf("can't open file %s/n",filename);
  return 0;
  }
 
  char buf[512];
  int i=0,count=1;
  int ch;
  while(!feof(fp)){
      ch=getc(fp);
      if(ch=='/n'){
    if(i>0){ //不是一个空行
       buf[i]=0;
    printf("NO.%d: %s/n",count,buf);
       count++;  
    i=0;
    }
   }else{
          buf[i]=ch;
    i++;
   }
  }
  fclose(fp);


  return 0;
}

任务描述 本关任务:编写函数,该函数从已有的当前目录下的文件a.txt读取并解析出其中的数值,并将结果写到当前目录下的文件b.txt中。 相关知识 文件 文件是存储在某种长期储存设备(磁盘、光盘等)上的一段数据流。C 语言中把文件看成一个有序的字节流,每个文件都以文件结束标志( EOF )结束。 下图是包含 n 个字节的文件内容: 磁盘文件由操作系统中的文件系统统一管理,也只有文件系统才能直接操作文件。所以编写 C 程序来操作文件实际上是需要调用文件系统的接口函数来进,我们学习文件的操作也就是学习一些 C 语言库中提供的函数。是不是感觉好简单啊:-)。 文件类型 C 语言在对文件操作,将文件分为文本文件和二进制文件文本文件:指可以用任何文字处理程序阅读和编辑的简单 ASCII 文件; 二进制文件:指一般含有特殊的格式或计算机代码,如图形文件和可执文件等。 下面我们本章节所学的操作都是针对文本文件而言。 文件的操作 C 语言中对文件的操作一般分为三个步骤:打开文件、读写文件、关闭文件。 打开文件 打开文件后,操作系统为文件建立一个文件控制结构(文件控制块),并在内存中建立一个缓冲区,该缓冲区的数据对应文件的数据,之后的文件读写操作实际上是在缓冲区中进。 读写文件 通过文件控制块实现文件的输入输出。 关闭文件文件缓冲区中的数据写回到磁盘文件中,并释放文件控制块。 操作文件的函数 用 FILE 结构操作文件是 C 语言提供的文件操作方式,只要包含头文件stdio.h就能使用文件操作的相关函数。下面就给大家介绍一些函数的使用。 打开文件 fopen 是stdio.h提供的文件打开函数。 如下面的程序可以打开一个文件用于读: #include <stdio.h> FILE *fp = fopen("a.txt","r"); // 打开一个供读取数据的文件a.txt。 其中函数的第一个参数是拟打开文件的路径和名字,可以包含相对路径或者绝对路径,如上面程序中就是打开当前目录下的a.txt文件。第二个参数是打开方式,fopen函数可以使用的打开方式如下表: 打开方式 描述 r 打开一个供读取数据的文件 w 建立或打开一个供写入数据的文件,如果该文件已经存在,则废弃文件内容 a 建立或打开一个供写入数据的文件,如果文件已经存在,则写入的数据将追加到文件的尾部 r+ 打开一个已存在的文件,该文件可以写入和读出数据 w+ 建立或打开一个可供读和写的文件,如果文件已存在,则废弃文件内容 a+ 建立或打开一个可供读和写的文件,如果文件已存在,则写入的数据追加到文件的尾部 b 打开一个二进制文件 如果文件打开成功,函数 fopen 将返回一个指向 FILE 结构的指针,该指针指向的 FILE 结构管理了被打开的那个文件。 如果文件打开失败(如打开一个不存在的文件用于读),那么该函数将返回 NULL。上面的程序将返回值赋值给FILE*的指针 fp ,之后就可以通过 fp 来操作打开的文件了。 读写文件文本文件读取一个字符可以使用 fgetc 函数: int fgetc(FILE *stream); 该函数表示从文件指针 stream 指向的文件的当前位置读取一个字符,并以 int 类型返回。 从文本文件读取可以使用 fgets 函数: char *fgets(char *string, int n, FILE *stream); 该函数表示从文件指针 stream 指向的文件的当前位置开始读取字符串,直到遇到换符(读入该换符),或到达文件结束位置,或读取了 n-1 个字符读取字符串存入 string 所指的内存单元中,并在所有读取字符之后添加字符串结束标记\0。 如果读取成功,函数返回 string,如果出错或读取前已经到达了文件结束的位置,将返回 NULL。 从文本文件中进格式化读取可以使用 fscanf 函数: int fscanf(FILE *stream, const char *format [,argument]...); 该函数的功能是从指定文件中将数据按照格式控制串 format 读出并转换成相应的类型以存入对应的参数中。如果读取成功,该函数返回转换成功的参数的个数,如果出错或读取前已经到达了文件结束的位置,将返回文件结束标志 EOF。 函数 fscanf 与 scanf 函数非常相似,只是 fscanf 函数多了一个参数 stream 以指向要读取数据的文件。 输出格式化数据到文本文件中可以使用 fprintf 函数: int fprintf(FILE *stream, const char *format [,argument]…); 该函数的功能是将数据按照格式控制串 format 写入到文件指针 stream 指向的文件中。如果写入成功,函数返回写入的字节数,否则返回一个负数表示错误。 函数 fprintf 与 printf 函数相似,只是 fprintf 函数多了一个参数 stream 以表示要写入数据的文件。 关闭文件 使用 fclose 函数就可以把缓冲区内最后剩余的数据输出到内核缓冲区,并释放文件指针和有关的缓冲区。 函数原型为: int fclose(FILE *fp); 如果流成功关闭,fclose 返回0,否则返回 EOF(−1)。(如果流为NULL,而且程序可以继续执,fclose设定error number给EINVAL,并返回EOF。) 例如: #include <stdio.h> int main(){ FILE *fp; fp = fopen("a.txt", "w"); fprintf(fp, "%s", "www.educoder.net"); fclose(fp); return(0); } 编程要求 在右侧编辑器中的Begin-End之间补充代码,完成 extractDigit 函数的编写(主函数已编写好),以实现使用 FILE 结构来操作文本文件的要求,来实现从已有的当前目录下的文件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)。 评测说明 平台会对你编写的代码进测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 测试输入: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 开始你的任务吧,祝你成功! #include <stdio.h> // 函数extractDigit的功能:从文件a.txt中提取数值写入文件b.txt中 void extractDigit(); // 请在此添加代码,实现extractDigit函数 /********** Begin *********/ /********** End **********/
05-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pick

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值