之前很多C语言程序都是面向终端的程序,这些程序的处理对象是终端,也即我们对电脑的操作。从终端流入,依靠的是我们使用的键盘等,从终端流出,靠的是显示器、打印机等。而现在要讲到的是面向文件的C语言程序。其特点在于输入流、输出流都是相对文件进行的。
最典型的例子就是在以终端为对象时,我们有puts、gets函数。puts函数用于输出给终端,gets用于从终端获取。而以文件为对象,有类似的函数fputs、fgets、fputc、fgetc。它们的作用是在文件中获取/填入(字符/字符串)。因此对文件的处理,我们应该“换位思考”。把我们当作文件,过去如何对终端反馈,现在就应该如何对文件反馈。
现在有这样一个例子:从键盘读入若干个字符串(为简便取三个),对它们按字母的大小顺序排序,然后把排好序的字符串存入磁盘文件中。
代码及注释如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
FILE *fp;
char str[3][10],temp[10];
int i,j,k,n=3;
printf("请输入字符串\n");
for(i=0;i<n;i++)
{
gets(str[i]); //这个时候进行的还是对终端的处理,所以还是gets
}
//冒泡法排序,这一段是不需要用文件相关函数的,
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(str[k],str[j])>0)k=j;
if(k!=i)
{
strcpy(temp,str[i]);
strcpy(str[i],str[k]);
strcpy(str[k],temp);
}
}
//下面打开文件(只写),让FILE型指针fp指向文件(这个FILE型其实是在stdio.h库中定义的结构体,使用了typedef代替),并判断文件是否成功打开
//我们打开路径为G:\\a1.txt的已预先建立好的文件,应注意的是原本文件地址中用的是"\",但在C语言中这代表转义字符,所以应该用"\\"
if((fp=fopen("G:\\a1.txt","w"))==NULL)
{
printf("无法打开文件,请检查!\n");
exit(0); //exit函数的作用是关闭所有文件,结束程序,需声明stdlib.h库才可使用
}
for(i=0;i<n;i++)
{
fputs(str[i],fp);
fputs("\n",fp); //调用fputs函数,将排好序的字符串放进指定文件中,每放完一个换行一次
}
return 0;
}
通过这个程序,我们成功的将由键盘输入的排好序的三个字符串输入了一个txt文件,如下图:
现在,我们要读回字符串,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
FILE *fp;
char str[3][10];
int i=0;
if((fp=fopen("G:\\a1.txt","r"))==NULL) //打开只读文件
{
printf("无法打开!\n");
exit(0);
}
while(fgets(str[i],10,fp)!=NULL)
{
printf("%s",str[i]); //因为之前输入的时候有换行符在,以不需要再换行了
i++;
}
fclose(fp); //养成好习惯,用完关闭文件,否则会造成缓冲区文件损坏(现在很多编译器会帮你做,但还是不能忘)
return 0;
}
这样就完成了一次对文件的基础操作。