
如果您不关注编辑器,则会错过很多知识. 提示: 重点在最后!
根据指定的工作模式打开文件时,可以读写文件. 根据文件的性质对以下操作进行分类. 根据文本文件和二进制文件的不同性质,对于文本文件,您可以按字符或字符串进行读写. 对于二进制文件,可以按块读取或写入,也可以按格式读取和写入.

C提供了fgetc和fputc函数来读取和写入文本文件中的字符. 该函数的原型以以下格式存储在stdio.h头文件中:
int fgetc(文件*流)
fgetc()函数从输入流的当前位置返回一个字符,并将文件指针指示符移动到下一个字符. 如果到达文件末尾,该函数将返回EOF. 写入文件后,应关闭文件.
int fputc(int ch,文件*流)
fputc()函数完成了将字符c h的值写入指定流文件的当前位置,并将文件指针后移一位. fputc()函数的返回值是所写字符的值,并在发生错误时返回EOF.
[示例1]根据读取和写入字符从文件中逐个读取存储在磁盘上的指定文本文件,然后将其显示在屏幕上. 使用main()和参数,指定的磁盘文件名由键盘通过命令行指定.
#i包含
主要(argc,argv)
int argc;
char * argv [];
{
char ch;
文件* fp;
int i;
if((fp = fopen(argv [1],“ r”))== NULL)/ *打开argv [1]指向的文件* /
{
printf(“未打开”);
退出(0);
}
while(((ch = fgetc(fp))!= EOF)/ *从文件中读取一个字符并将其显示在屏幕上* /
putchar(ch);
fclose(fp);
}
程序是带参数的main()函数,需要在命令行上运行. 它的参数argc用于记录输入参数的数量,argv是指针数组,用于存储输入参数字符串. 数字由argc描述. 假设我们将要读取的文件名指定为L8-2.c,并且列表文件的内容是源程序. 编译和连接后,将生成可执行文件L8-2.exe. 运行程序l8-2.exe,并按如下所示进入命令行模式:
c: / tc> l8-2 L8-2.c
以上程序在命令行上运行,有两个输入参数字符串,分别为argv [0] =“ c: / tc> l8-2”,argv [1] =“ L8-2.c”, argc =2. 因此,打开的文件为L8-2.c. 在程序中,不断测试fgetc()函数的返回值. 如果读取文件末尾或读取文件不正确,则将返回C的整数常数EOF. 程序的运行输出是源程序本身:
c: / tc> l8-2 L8-2.c
#i包含
主要(argc,argv)
int argc;
char * argv [];
{
char ch;
文件* fp;
int i;
if((fp = fopen(argv [1],“ r”))== NULL)/ *打开argv [1]指向的文件* /
{
printf(“未打开”);
退出(0);
}
while(((ch = fgetc(fp))!= EOF)/ *从文件中读取一个字符并将其显示在屏幕上* /
putchar(ch);
fclose(fp);
}
[示例2]从键盘输入字符并将其保存在磁盘文件test.txt中:
#i包含
主要()

{
FILE fp; / *定义文件变量指针* /
char ch;
if(((fp = fopen(“ test.txt”,“ w”))== NULL)/ *以只读模式打开文件* /
{
printf(“无法打开文件!/ n”);
退出(0);
}
while(((ch = fgetchar())!='/ n')/ *只要输入字符不是回车符* /
fputc(ch,fp)/ *在文件中写一个字符* /
fclose(fp);
}
程序将输入一个字符串,该字符串以键盘上的回车符结尾,并将其写入指定的流文件test.txt. 该文件仅以文本形式打开,因此流文件可读并且支持各种字符处理工具访问. 简单地说,我们可以通过DOS提供的type命令列出文件的内容.
运行程序:
我爱中国!
在DOS操作系统环境下,使用type命令如下显示test.txt文件:
c: / tc>键入test.txt
我爱中国!

C提供的用于读取和写入字符串的函数原型位于stdio.h头文件中,其函数形式为:
Char * fgets(char * str,int num,FILE *流)
fgets()函数从流文件流中读取最多num-1个字符,并将它们放入str指向的字符数组中. 读取字符,直到遇到回车符或E O F(文件末尾),或者读取的字符数有限.
int fputs(char * str,FILE *流)
fputs()函数将str指向的字符串写入流文件. 操作成功后,该函数返回值0,如果失败,则返回非零值.
[示例3]将一个字符串写入磁盘并写入文本文件test.txt:
#i包含
#i包含
主要()
{
文件* fp;
char str [128];
if((fp = fopen(“ test.txt”,“ w”))== NULL)/ *打开纯文本文件* /
{
printf(“无法打开文件!”);
退出(0);
}
while((strlen(gets(str)))!= 0)
{/ *如果字符串长度为零,则结束* /
fputs(str,fp); / *写字符串* /
fputs(“ / n”,fp); / *写回车* /
}
fclose(fp); / *关闭文件* /
}
运行程序,从键盘输入不超过1 2 7个字符的字符串,然后写入文件. 如果字符串长度为0,则为空字符串,程序结束.
输入: 您好!
你好吗
再见!
运行后,我们使用dos type命令列表文件:
c: / tc>键入test.txt
你好!

你好吗
再见!
此处输入的空字符串实际上是一个回车符. 原因是gets函数确定该字符串的结尾标记有回车符.
[示例4]从文本文件test1.txt中读取字符串,然后写入文件test2.txt.
#i包含
#i包含
主要()
{
文件* fp1,* fp2;
char str [128];
如果((fp1 = fopen(“ test1.txt”,“ r”))== NULL)
{/ *以只读方式打开文件1 * /
printf(“无法打开文件/ n”);
退出(0);
}
如果((fp2 = fopen(“ test2.txt”,“ w”))== NULL)
{/ *以只读模式打开文件2 * /
printf(“无法打开文件/ n”);
退出(0);
}
while((strlen(fgets(str,128,fp1)))> 0)
/ *从文件读回的字符串的长度大于0 * /
{
fputs(str,fp2); / *从文件1读取字符串并写入文件2 * /
printf(“%s”,str); / *在屏幕上显示* /
}
fclose(fp1);
fclose(fp2);
}
程序总共操作两个文件,并且需要定义两个文件变量指针. 因此,在操作文件之前,应同时以所需的工作模式(没有特定顺序)打开两个文件. 读写后,关闭文件. 设计过程在写入文件的同时显示在屏幕上,因此,程序运行后,您应该看到已添加与原始文件相同的文本文件,并且在屏幕上显示了文件内容.

在以前的程序设计中,我们介绍了使用scanf()和printf()函数来格式化键盘输入和显示器上输出的格式. 格式化和读写文件的方法是在上述功能之前添加一个字母f,使其成为fscanf()和fprintf(). 其函数调用方法:
int fscanf(文件*流,字符*格式c语言文件,arg_list)
int fprintf(文件*流,字符*格式,arg_list)
其中,stream是流文件指针,其余两个参数的用法与scanf()和printf()相同.
[示例5]将一些格式化的数据写入文本文件,然后通过格式化方法将文件中的显示内容读取到屏幕上
在屏幕上,格式化的数据是两个学生的记录,包括姓名,学生编号和两个学科的分数.
#i包含
主要()
{
文件* fp;
int i;
struct stu {/ *定义结构类型* /
字符名称[15];
字符数[6];
浮动分数[2];
}学生; / *描述结构变量* /
if((fp = fopen(“ test1.txt”,“ w”))== NULL)
{/ *以纯文本模式打开文件* /
printf(“无法打开文件”);

退出(0);
}
printf(“输入数据: / n”);
for(i = 0; i <2; i ++)
{
scanf(“%s%s%f%f”,student.name,student.num和student.score [0],
&student.score [1]); / *从键盘输入* /
fprintf(fp,“%s%s%7.2f%7.2f / n”,student.name,student.num,
student.score [0],student.score [1]); / *写入文件* /
}
fclose(fp); / *关闭文件* /
if((fp = fopen(“ test.txt”,“ r”))== NULL)
{/ *以文本只读格式重新打开文件* /
printf(“无法打开文件”);
退出(0);
}
printf(“文件输出: / n”);
同时(fscanf(fp,“%s%s%f%f / n”,student.name,student.num和student.score [0]c语言文件,student.score [1])!= EOF)<
/ *从文件读取* /
printf(“%s%s%7.2f%7.2f / n”,student.name,student.num,
student.score [0],student.score [1]); / *显示在屏幕上* /
fclose(fp); / *关闭文件* /
}
编写一个文件变量指针,以不同的方式打开同一文件两次,写入和读取格式化的数据,使用该格式写入文件非常重要,必须使用该格式从文件中读取,否则,读取的数据与格式控制字符不一致,从而导致数据错误. 上面的程序运行如下:
输入数据:
xiaowan j001 87.5 98.4
xiaoli j002 99.5 89.6
文件输出:
xiaowan j001 87.50 98.40
xiaoli j002 99.50 89.60
列表文件的内容显示为:
c: />输入test.txt
xiaowan j001 87.50 98.40
xiaoli j002 99.50 89.60
如果打开文件的方法是:
,也可以将该程序访问的文件定义为二进制文件.
if((fp = fopen(“ test1.txt”,“ wb”))== NULL)
{/ *以二进制只写模式打开文件* /
printf(“无法打开文件”);
退出(0);
}
效果完全一样.

对于复杂的数据类型,先前介绍的几种读取和写入文件的方法无法全部写入或读取文件. C语言提供了块读取和写入方法来操纵文件,因此可以一次读取和写入数组或结构以及其他类型. 块读写文件功能的调用形式为:
int fread(无效* buf,int大小,int计数,FILE *流)
int fwrite(无效* buf,整数大小,整数计数,文件*流)
The
fread()函数从流指向的流文件中读取计数(字段)字段,每个字段的大小(字段长度)个字符长,并将它们放入buf(缓冲区)指向的字符数组中.
fread()函数返回实际读取的字段数. 如果调用该函数时需要读取的字段数超过了文件中存储的字段数,则发生错误或到达文件末尾. 在实际操作中,应注意检测.
fwrite()函数将buf(缓冲区)指向的字符数组中的count(字段编号)字段写入stream指向的流中,每个字段的长度为size个字符,并在函数操作成功时返回. 写入的字段数.

关于块文件的读取和写入,只能在创建文件时以二进制文件格式创建它们.
[示例6]将格式化的数据写入磁盘,然后从文件中读取并将其显示在屏幕上.
#i包含“ stdio.h”
#i包含“ stdlib.h”
主要()
{
文件* fp1;
int i;
struct stu {/ *定义结构* /
字符名称[15];
字符数[6];
浮动分数[2];
}学生;
如果((fp1 = fopen(“ test.txt”,“ wb”))== NULL)
{/ *以二进制只写模式打开文件* /
printf(“无法打开文件”);
退出(0);
}
printf(“输入数据: / n”);
for(i = 0; i <2; i ++)
{
scanf(“%s%s%f%f”,student.name,student.num和&student.score [0]和&student.score [1]); / *输入记录* /
fwrite(&学生,sizeof(学生),1,fp1); / *逐块写入文件* /
}
fclose(fp1);
如果((fp1 = fopen(“ test.txt”,“ rb”))== NULL)
{/ *以二进制只写格式重新打开文件* /
printf(“无法打开文件”);
退出(0);
}
printf(“文件输出: / n”);
for(i = 0; i <2; i ++)
{
fread(&学生,sizeof(学生),1,fp1); / *从文件中逐块读取* /
printf(“%s%s%7.2f%7.2f / n”,student.name,student.num,student.score [0],student.score [1]); / *显示到屏幕* /
}
fclose(fp1);
}
运行程序:
输入数据:
xiaowan j001 87.5 98.4
xiaoli j002 99.5 89.6
文件输出:
xiaowan j001 87.50 98.40
xiaoli j002 99.50 89.60
通常,如果输入数据的格式更加复杂,我们可以将各种格式的数据作为字符串输入,然后将字符串转换为所需的格式. C提供功能:
int atoi(char * ptr)
float atof(char * ptr)
long int atol(char * ptr)
它们分别将字符串转换为整数,实数和长整数. 使用时,请编写程序前面包含的头文件math.h或stdlib.h.

喜欢本文或认为本文对您有帮助的读者可以按需关注或转发. 私人信件编辑器001可获得2018年最新的C / C ++信息和由编辑器组织的0个基本教程,欢迎初学者和高级朋友
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-184071-1.html
错
平生