桓楠百科网

编程知识、经典语录与百科知识分享平台

C语言编程入门:利用fscanf()将文件里的数据读出来

文件可以用来保存输入的信息。

文件读写的四个步骤:

第1步:定义文件指针;第2步:打开文件;第3步:文件读写;第4步:关闭文件(保存数据到文件)。

第3步尤其重要,我们已经讲了如何将数据写到文件里,今天将怎样将文件里的数据读出来。

再次声明:这里只讲文本文件的读写,二进制文件不讲。

我们都知道输入函数scanf( )和输出函数printf( )。

输出函数printf( )的功能是将数据输出到标准输出设备,如电脑显示器就是标准输出设备。

同理,输入函数scanf( )的功能是将数据从标准输入设备读到电脑里,如键盘就是标准输入设备。

下面的例子将数据写到文件AAA.txt里。

程序1:

那么文件AAA.txt的内容就是三个整数,这样我们可以用系统函数fscanf( )将文件里的数据读出来。

我们上次学过系统函数fprintf( )的语法格式:

fprintf(文件指针,“输出信息”);

如果输入信息中有格式控制符如%d、%f、%c、%s的,那么语法格式如下:

fprintf(文件指针,“输出信息”,变量表);

fprintf( )函数的功能是将数据写到文件里,即保存数据到文件。

那么,将文件里的数据读出来的系统函数就是fscanf( )

fscanf( )的语法格式为:

fscanf(文件指针,“格式控制符”,变量表);

格式控制符跟我们以前说的一样:

%d 对应整型(int)变量

%f 对应单精度实型(float)变量

%lf 对应双精度实型(double)变量

%c 对应字符型(char)变量

%s 对应字符数组(字符串,char [ ] 型)变量

假设我们要求输入3个整数,保存到文件AAA.txt中,然后再读出这个文件的内容在显示器上显示,程序如下:

程序2:

程序2中定义了两个文件指针变量fp1和fp2。

无论是fp1还是fp2,第一步都要用open( )打开文件。

fp1用于写文件,它的打开方式为aw。

w是写的意思,a是追加的意思,就是说如果文件AAA.txt有内容的话,新写入的内容追加到原内容的后面,不会覆盖掉原有内容。

fp2用于读文件,它的打开方式为r。

fp2将文件内容读出来。

程序2运行结果:

伙伴们有没有注意到这个运行结果中输入的三个整数是10 20 30,但是为什么读出来的数据是:100 200 300?

我们打开文件AAA.txt看看它的内容是什么:

原来这个文件AAA.txt原来是有内容的,第1行是100 200 300,第2行是1 2 3,新读入的数据10 20 30写到了第3行。

而用fp2读文件时,是从头开始读的,读出三个数据就是100 200 300。

如果程序2中fp1打开文件的方式是w而不是aw,那么读入的新数据会覆盖掉原有的所有数据,则此时读出来的内容才是10 20 30。

但是我们这样读文件实际上是不现实的,我们怎么知道这个文件有多少行?而且我一般会想把文件的所有内容都读出来。

此时需要用循环,循环条件为:!feof(fp2)

feof(fp2)的意思是当fp2指针指到文件末(即读到文件末尾了)时,返回真,否则返回假。

前面加一个!,!是逻辑运算符“非”,否定的意思。

feof(fp2)的意思是当fp2指针指到文件末时,返回真,否则返回假。

那么 !feof(fp2)的意思就是相反,当文件指针没有指到文件末时,返回真,继续循环;

当文件指针已经指到文件末,返回假,终止循环。

程序3:

在运行程序3之前,我们先看看文件AAA.txt的内容:

运行程序3,运行结果为:

很奇怪,最后一行应该是刚输入的11 22 33,但显示的却是10 20 30。这是出错了,为什么?

这是因为读出来时,文件每一行末尾的回车没有读,所以要把fscanf( )中的输入形式改一下,改为:

在三个%d的后面还要写一个\n,意思是读出三个整数分别赋予变量a2、b2和c2,然后文件中的换行符在fscanf( )里消化掉了,这样数据才不会出错。

我们把文件AAA.txt的内容改为还是三行:

100 200 300

1 2 3

10 20 30

则我们执行修改后的程序4:

程序4和程序3唯一不同就是fscanf( )中多了一个换行,运行结果:

最新输入的11 22 33并没有读出来,为什么?

因为上次我们说过,fclose( )是关闭文件,也是保存数据。

而程序4中,fclose(fp1)在最后才执行,也就是说,fp2打开文件时,fp1还没有关闭。

没有关闭就意味着刚才读入的数据11 22 33还没有保存到文件AAA.txt中,所以读出来的还是原来的三行。

怎么办?

先关闭fp1保存刚才写入的数据,再打开fp2读文件内容。

即把fclose(fp1)放在fp2=fopen("AAA.txt", "r")之前。

程序5:

//*********************程序开始***********************************//

#include <stdio.h>

int main()

{ FILE *fp1, *fp2; //定义2个文件指针

int a1,b1,c1;

int a2,b2,c2;

printf("请输入三个整数: ");

scanf("%d%d%d",&a1,&b1,&c1);

printf("\n从键盘输入的数据为:\n");

printf("%d %d %d\n",a1,b1,c1);

printf("\n以上数据保存到文件AAA.txt\n");


fp1=fopen("AAA.txt", "aw"); //fp1打开方式aw,写文件

fprintf(fp1, "%d %d %d\n", a1, b1, c1); //写文件


fclose(fp1); //关闭文件

fp2=fopen("AAA.txt", "r"); //fp2打开方式r,读文件


while(!feof(fp2)) //读入换行消化掉

{

fscanf(fp2, "%d%d%d\n", &a2, &b2, &c2);

printf("%d %d %d\n",a2,b2,c2);

}


fclose(fp2); //关闭文件

return 0;

}

//*********************程序结束***********************************//

上述程序可以直接复制到 Dev C++中运行。

程序第一行斜杠星号和最后一行斜杠星号是为了给大家看清楚程序代码就在这两行中间,复制程序代码时可以不用复制这两行斜杠星号。

为了让结果看得更清楚,我们手工把这个记事本文件AAA.txt的内容改为三行:

100 200 300

1 2 3

10 20 30

运行程序5,运行结果如下:

这回终于对了。

可能有朋友有疑问:我怎么知道正好读出3个整数就换行?这是因为这个文件是我们自己创建的,我们知道正好一行是3个整数,所以读出3个整数就换行。

如果文件内容是:

100 200

1 2

10 20

那么程序5的运行就会出现乱码。

怎么完善呢?可以有办法完善的。

今天先讲到这里。

总结

1、今天介绍了文件输出函数fprintf( )和文件输入函数fscanf( )。

fprintf( )的语法格式:

fprintf(文件指针,“输出信息”);

如果输入信息中有格式控制符如%d、%f、%c、%s的,那么语法格式如下:

fprintf(文件指针,“输出信息”,变量表);

fscanf( )的语法格式为:

fscanf(文件指针,“格式控制符”,变量表);

2、读文件时,需要用到循环:while(!feof(fp2))

3、如果不执行fclose( ),那么文件内容不会得到保存。

4、读文件的格式要和原来文件格式一样,比如有换行时要自行消化掉。

5、留出问题:怎样写出一个通用性更强的文件读出语句?

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言