C语言文件读写
printf(),scanf(),getchar(),putchar()等语句,都是将数据输出到标准输出stdout(显示器),或从标准输入stdin(键盘)读取数据。并要依赖include
但当需求操作的数据量十分巨大时,标准的输入和输出就显得力不从心了。
而通过从磁盘文件中读写数据,能够弥补这个缺陷。
数据传输:
解析:
1.程序运行时,产生的所有数据都暂存在内存的程序数据区中。
2.当输入/输出数据时,数据从磁盘/程序数据区转移入输入/输出缓存区,然后再从输入/输出缓存区转移至程序数据区/磁盘。
3.操作系统将外部设备也当做文件进行管理。即:标准输入/输出的流程也如上图所示,不过是磁盘换成了键盘/显示器。
使用C语句操作文件时的步骤:
1.定义文件指针变量
2.打开文件
3.对文件进行读写
4.关闭文件
打开文件
含义:
将文件信息从磁盘装入计算机内存,建立与文件有关的信息,建立文件指针与文件名之间的关联。
形式:
fp=fopen(文件名,使用文件方式);
返回值:
成功: FILE类型指针
失败: NULL
举例:
FILE *fp;
fp=fopen("c:\\A1.txt","r");
注2:实际上文件的实际路径是c:\A1.txt 多了一个斜杠是因为\在C语句中是作为转义字符出现的。为了使其只作为\字符使用,需要加上一个转义字符使其转义。
注3:在程序开始运行时,系统会自动打开:标准输入(stdin)、标准输出(stdout)、标准错误(stderr)这三个文件。所以我们使用scanf或printf函数时不需要指定文件指针
使用文件方式:
方式 | 含义 |
"r" | 只读,为输入打开一个文本文件 |
"w" | 只写,为输出打开一个文本文件 |
"a" | 追加,向文本文件尾增加数据 |
写入(输出到文件)
格式化输出:
fprintf(文件指针,格式字符串,输出表列);
代码示例1:
#include
#include
/*
这个程序用来测试数据写入文件操作
*/
int main()
{
FILE *outp;
outp=fopen("testio.txt","w");
if(outp==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
int temp;
int i=10;
while(i--)
{
scanf("%d",&temp);
fprintf(outp,"%d\t",temp);
}
printf("done");
fclose(outp);
return 0;
}
1.控制台:
2.项目文件夹内:
3.输出的txt文件内:
解析:
1.注意FILE定义的是一个指针而非变量。
2.exit(0)可以直接中止程序,但要使用这个函数必须在文件头部加上include
3.定义了outp指针并执行outp=fopen()之后,文件指针outp就代表需要打开的文件。之后所有对该文件的操作都利用outp来完成。
4.fopen()函数用于打开文件,成功将返回一个FILE类型的指针,失败将返回NULL。所以可以通过判断该指针的值是否为NULL来判断打开时候成功。
5.fprintf()函数用于将数据输出至目标文件。
6.fclose()函数用于关闭文件,在关闭的同时,会将缓存区中剩余所有的数据读入/写出。所以为了保证文件读写不出现数据流失的情况,fclose是必须被使用的。
代码示例2:
#include
#include
/*
这个程序用来测试输出数据至csv文件
*/
int main()
{
FILE *fp;
int i,No;
float salary;
fp=fopen("data.csv","w");//csv格式是一种可以直接作为Exce表格打开的格式,十分有用。
if(fp==NULL)
{
printf("File cannot open!");
exit(0);
}
//输入5名员工的工号和工资,并保存入文件中
for(i=0;i<5;i++)
{
scanf("%d %f",&No,&salary);
fprintf(fp,"%d,%.2f\n",No,salary);//csv格式默认使用逗号分隔数据,所以这里输出时用逗号分隔。
}
fclose(fp);
return 0;
}
结果:
1.控制台:
2.项目文件夹内:
3.用表格打开:
4.用记事本打开:
解析:
1.如上所示,能够通过改变输出文件的后缀名,改变输出文件的格式。
2.和printf()函数相同,fprintf()也能通过改变格式字符串改变输出数据的格式(如示例2,在No和salary间使用逗号分隔就是通过改变格式字符串实现的)。
读取(从文件输入)
格式化输入:
fscanf(文件指针,格式字符串,输入表列);
代码示例:
#include
#include
/*
这个程序用来测试格式化输入(从文件读取数据)
*/
int main()
{
FILE *fp;
if((fp=fopen("data.csv","r"))==NULL)//将对文件指针的赋值和空值判断放在一起,提高代码效率。
{
printf("file cannot open");
exit(0);
}
int i=5,No=0;
double salary;
while(i>0)
{
fscanf(fp,"%d,%lf",&No,&salary);//此处的格式字符串要符合输入数据的格式
printf("%d\t%.2f\n",No,salary);
i--;
}
printf("done");
return 0;
}
解析:
fscanf基本和scanf的使用相同,可以类比fprintf和printf的区别来理解。
字符型数据的读写
字符型写入:
函数原型:int fputc(int ch,FILE *fp);
功能:把字符ch写到fp指向的磁盘文件中。
返回值:
成功:返回被写入的字符(即ch所代表的字符)
失败:返回EOF(值为-1)
代码示例:
#include
#include
/*
这个程序用来测试字符数据的文件写入
*/
int main()
{
FILE *fp;
char c;
if((fp=fopen("data.dat","w"))==NULL)
{
printf("File cannot open!");
exit(0);
}
while((c=getchar())!=EOF)//EOF即Ctrl+z 值为-1
{
fputc(c,fp);//将字符写入文件
}
fclose(fp);
return 0;
}
结果:
控制台:
项目文件夹内:
dat文件内:
解析:
EOF即Ctrl+z只要从键盘输入这个值,上述代码中的循环就将结束
字符型数据读取
函数原型:int fgetc(FILE *fp);
函数功能:
从文件指针fp指向的文件当前位置(位置指针)读出一个字符,然后文件位置指针自动后移,指向文件中的下一个字符,返回值为读入的字符。
若遇到文件结束符,则返回结束符EOF(-1).
返回值:
成功:读入的字符
失败或读到文件末尾:结束符EOF(-1)
代码示例:
#include
#include
/*
这个程序用来测试从文件中读取字符型数据
*/
int main()
{
FILE *fp;
if((fp=fopen("data.dat","r"))==NULL)
{
printf("File cannot open!");
exit(0);
}
char c;
while((c=fgetc(fp))!=EOF)
{
putchar(c);
}
fclose(fp);
return 0;
}
结果:
解析:
当读完了所有数据,最后会读到一个EOF(文件结束符)。所以这里将这个作为循环结束的标志。
应用
读/写 | 指定格式 | 以字符为单位 |
从文件读入 | fscanf(文件指针,格式字符串,输入表列); | fgetc(文件指针); |
写到文件中 | fprintf(文件指针,格式字符串,输出表列); | fputc(文件指针); |
示例1:
复制文件
#include
#include
/*
这个程序用来将source.txt复制为target.txt
*/
int main()
{
FILE *fpin,*fpout;
char c;
printf("file copy.....\t");
if((fpin=fopen("source.txt","r"))==NULL)
{
printf("Source fille cannot open!");
exit(0);
}
if((fpout=fopen("target.txt","w"))==NULL)
{
printf("Target file cannot open!");
exit(0);
}
while((c=fgetc(fpin))!=EOF)
{
fputc(c,fpout);
}
fclose(fpin);
fclose(fpout);
printf("done");
return 0;
}