初识C语言时,对文件输入输出模块并没有仔细去看,大致浏览了一遍就这样翻过去了 因为考试也不考,所以何必费那些闲工夫啊! 现在看来,C语言的文件输入输出模块对于一名程序员来说是非常有用的东西,没有这些,所有的操作只能说是纸上谈兵,关机之后统统的见鬼去了!近来想想,C语言这东西,挺适合自己自学的,并不是说明个人资质不错,只是学校教的东西,完全可以自己从书上获取,重要的是我们要用自己的双手成就自己的程序! 只有自己亲自实践过,才有自己的体会,这些东西可是灰常重要的! 好了,开始正题!
一、fgetc()与fputc()
#include "stdio.h"
#include "stdlib.h"
void writefile(FILE *fp)
{
char ch;
printf("请输入文件内容,以#结束! \n");
ch=getchar();
while(ch!='#')
{
fputc(ch,fp); // fputc(ch,fp)
ch=getchar();
}
rewind(fp);
}
void readfile(FILE *fp)
{
char ch;
printf("读取文件内容:\n");
ch=fgetc(fp);
while(!feof(fp))
{
putchar(ch);
ch=fgetc(fp); // ch=fgets(fp)
}
printf("\n文件读取结束\n");
}
int main()
{
FILE * fp;
char inputfile[20];
printf("请输入文件名:");
gets(inputfile);
fp=fopen(inputfile,"w+");
if(fp==NULL)
{
printf("打开文件失败!");
exit (1);
}
else
{
printf("打开%s成功!\n",inputfile);
}
writefile(fp);
readfile(fp);
fclose(fp);
return 0;
}
● fgetc()格式 变量=fgetc(文件指针) fputc()格式 fput(字符量,文件指针)
● 若读写失败,都会返回符号常量EOF(在stdio.h中定义),值为-1
● getc()与fgetc()功能相同,putc()与fputc()功能相同
二、fgets()与fputs()
#include "stdio.h"
#include "stdlib.h"
int main() //编程实现文件的复制
{
FILE *fp;
char str[100],s[100],filename[50];
printf("请输入字符串:\n");
gets(str);
printf("请输入文件所在路径及名称:\n");
scanf("%s",filename);
if((fp=fopen(filename,"ab"))!=NULL)
{
fputs(str,fp); // fputs(str,fp) 把字符串str写入到文件中
fclose(fp);
}
else
{
printf("打开失败!");
exit(0);
}
if((fp=fopen(filename,"rb"))!=NULL)
{
printf("%s文件的内容是:\n",filename);
while(fgets(s,sizeof(s),fp)) // fgets(str,n,fp) 从文件读出n-1字符串到str
{
printf("%s",s);
}
fclose(fp);
}
return 0;
}
● 调用格式 fgets(字符数组名,n,文件指针) fputs(字符串,文件指针)
● fgets()会把n-1个字符复制到字符数组里,而不是n个
三、fscanf()与fprintf()
#include "stdio.h"
#include "stdlib.h"
struct rec
{
char id[10];
char name[20];
float price;
int count;
};
// 将键盘输入的信息写到文件中
void writefile(FILE *fp,int n)
{
int i;
struct rec record; // 用作缓冲
printf("******************请输入商品数据********************\n");
for(i=0;i
{
printf("请输入序号:");
scanf("%s",record.id);
printf("请输入名称:");
scanf("%s",record.name);
printf("请输入价格:");
scanf("%f",&record.price);
printf("请输入数量:");
scanf("%d",&record.count);
fprintf(fp,"%s %s %.2f %d \n",record.id,record.name,record.price,
record.count);
}
}
// 从文件读出商品信息
void readfile(FILE *fp,int n)
{
struct rec record; // 用作缓冲
double total =0;
rewind(fp);
while(fscanf(fp,"%s %s %f %d\n",record.id,record.name,
&record.price,&record.count)!=EOF)
{
printf("序号:%s 名称:%s 价格:%5.2f 数量:%d \n",record.id,record.name,
record.price,record.count);
total=total+record.price*record.count;
}
printf("合计:%5.2f",total);
}
int main()
{
char filename[20];
int n;
FILE * fp;
printf("请输入目标文件:\n");
scanf("%s",filename);
printf("请输入商品数量:\n");
scanf("%d",&n);
fp=fopen(filename,"w+");
if(fp==NULL)
{
printf("打开文件失败!");
exit(1);
}
writefile(fp,n);
readfile(fp,n);
fclose(fp);
return 0;
}
● 调用格式 fscanf(文件指针,格式字符串,输入参数) 如:fscanf(fp,"%d %s",&i,str)
fprintf(文件指针,格式字符串,输出参数列表) 如:fprintf(fp,"%d %s",i,str)
● 该程序在主函数完成打开、关闭文件 在被调函数中定义缓冲结构体用于数据的输入输出
四、fread()与fwrite()
#include "stdio.h"
#include "stdlib.h"
struct rec
{
char id[10];
char name[20];
float price;
int count;
};
// 将键盘输入的信息写到文件中
void writefile(FILE *fp,int n)
{
int i;
struct rec record; // 用作缓冲
printf("******************请输入商品数据********************\n");
for(i=0;i
{
printf("请输入序号:");
scanf("%s",record.id);
printf("请输入名称:");
scanf("%s",record.name);
printf("请输入价格:");
scanf("%f",&record.price);
printf("请输入数量:");
scanf("%d",&record.count);
// fprintf(fp,"%s %s %.2f %d \n",record.id,record.name,record.price,
// record.count);
fwrite(&record,sizeof(record),1,fp);
}
}
// 从文件读出商品信息
void readfile(FILE *fp,int n)
{
struct rec record; // 用作缓冲
double total =0;
rewind(fp);
// while(fscanf(fp,"%s %s %f %d\n",record.id,record.name,
// &record.price,&record.count)!=EOF)
while(fread(&record,sizeof(record),1,fp))
{
printf("序号:%s 名称:%s 价格:%5.2f 数量:%d \n",record.id,record.name,
record.price,record.count);
total=total+record.price*record.count;
}
printf("合计:%5.2f",total);
}
int main()
{
char filename[20];
int n;
FILE * fp;
printf("请输入目标文件:\n");
scanf("%s",filename);
printf("请输入商品数量:\n");
scanf("%d",&n);
fp=fopen(filename,"ab+");
if(fp==NULL)
{
printf("打开文件失败!");
exit(1);
}
writefile(fp,n);
readfile(fp,n);
fclose(fp);
return 0;
}
● 格式 fwrite(buffer,size,count,fp) fread(buffer,size,count,fp)
● buffer 存放输入输出数据的首地址 size 数据块的大小(字节数) count 数据块的个数
● 读写成功返回值都是count的值 失败返回0 可以依据此判断文件是否读写结束
Summary:
1. fgetc与fputc 用于读写单个字符
2. fgets与fputs 用于读写一个字符串
3. fscanf与fprintf 用于格式化读写数据块
4. fread与fwrite 用于非格式化读写二进制文件
这就是这个周六的看书总结了,有错误或是不清楚的地方欢迎大家提出,指正