目录
C语言中对于文件的操作是通过指针来完成的,要注意,文件指针不是指向一段内存空间的,它实际上指向的是描述这个文件相关信息的一个文件结构体。
声明文件指针变量的形式为:
FILE *file;
定义好一个文件指针变量后就需要初始化这个文件指针变量或者说是打开文件。
一、打开文件
打开文件通过fopen函数完成,比如
file = fopen("1.txt","r+");
fopen函数中有两个传入参数,第一个参数是文件的名称,比如“1.txt”,要注意,如果这个文件没有和你的程序处于同一目录下,需要写入全部路径,例如 "c:\\1\\1.txt";第二个参数为打开文件的方式,他可以从下面几个方式中打开
打开方式 | 含义 | 指定文件不存在时 | 指定文件存在时 |
r | 只读方式打开文本文件 | 出错 | 正常打开 |
w | 只写方式打开文本文件 | 建立新文件 | 文件原有内容丢失 |
a | 追加方式打开文本文件 | 建立新文件 | 在原有内容末尾追加 |
r+ | 读/写方式打开文本文件 | 出错 | 正常打开 |
w+ | 读/写方式创建新的文本文件 | 建立新文件 | 文件原有内容丢失 |
a+ | 读/追加方式建立新的文本文件 | 建立新文件 | 在原有内容末尾追加 |
rb | 只读方式打开二进制文件 | 出错 | 正常打开 |
wb | 只写方式打开二进制文件 | 建立新文件 | 文件原有内容丢失 |
ab | 追加方式打开二进制文件 | 建立新文件 | 在原有内容末尾添加 |
rb+ | 读/写方式打开二进制文件 | 出错 | 正常打开 |
wb+ | 读/写方式创建新的二进制文件 | 建立新文件 | 文件原有内容丢失 |
ab+ | 读/追加方式创建新的二进制文件 | 建立新文件 | 在原有内容末尾追加 |
因此,在打开文件时,要根据你所需要的格式选择打开方式,比如当你没有文件,想要创建一个文件时可以选择 w+
二、读写文件
C语言中对于文件的读写主要分为五类,
- 字符的读写:fgetc()函数和fputc()函数
- 字符串的读写:fgets()函数和fputs()函数
- 数据块的读写:fread()函数和fwrite()函数
- 格式化读写:fscanf()函数和fprintf()函数
- 随机读写函数:fseek()、rewind()、ftell()
1、字符的读写
fputc()函数
格式:fputc(c,fp);
功能:用来将一个字符写入到文件中。在格式中fp是已经定义的文件指针变量;c为要写入的字符,可以是字符常量或字符型变量,该函数 是有返回值的。
返回值:如果执行成功,返回写入的字符;否则,返回EOF,(EOF是C语言编译系统定义的文本文件结束标志,其值为-1,十六进制表 示为0xff,在stdio.h中定义),表示写操作失败。
#include "stdio.h"
#include "stdlib.h"
void main()
{
FILE *file;
char c = 0;
file = fopen("1.txt","w+");
if(file == NULL){
printf("文件打开错误!\n");
exit(0);
}
c = 'A';
fputc(c,file);
fputc('\n',file);
fclose(file);
}
要注意,fputc()函数中传入的第一个参数为字符,而不是字符的地址,第二个变量为文件指针。
上述例程运行完毕后,1.txt文件中内容应该是c与一个换行
c
fgetc()函数
格式: c=fgetc(fp);
功能:用来从指定的文本文件中读取一个字符。其中,fp为文件指针,c为要写入的字符。该函数的功能是从指定的文件中读取一个字符, 并赋值给字符型变量c。
返回值:读取成功返回读取字符,读取错误或遇到结束标志EOF,返回EOF。
#include "stdio.h"
#include "stdlib.h"
void main()
{
FILE *file;
char c = 0;
file = fopen("1.txt","r+");
if(file == NULL){
printf("文件打开错误!\n");
exit(0);
}
c = fgetc(file);
printf("文件中读取到的字符为:%c\n",c);
fclose(file);
}
这样读取到的字符就是在 1.txt文件中存取的第一个字符,如果有一连串字符时,fgetc()函数会自动后移,例如1.txt文件中存有下面这些内容
casdkwuhdkshdkahwudo
那么,在下面这个例程中
#include "stdio.h"
#include "stdlib.h"
void main()
{
FILE *file;
char c = 0;
file = fopen("1.txt","r+");
if(file == NULL){
printf("文件打开错误!\n");
exit(0);
}
while(c != EOF){
c = fgetc(file);
printf("%c",c);
}
fclose(file);
}
那么屏幕上将输出
casdkwuhdkshdkahwudo
这是因为file这个文件指针变量会自动记录当前读取或者写入的位置,并且自动后移,因此如果你需要读取了一串字符后,又想回到文件开头进行读取,就需要该边文件指针的位置。
2.字符串的读写
fputs()函数
格式:fputs(s,fp);
功能:用来将一个字符串写入指定的文本文件。其中,fp为文件指针,s可以是字符数组名,字符型指针变量或字符串常量。该函数的功能 是将字符串s写入由fp指向的文件中,字符串末尾的‘\0’字符不允写入。
返回值:执行成功,返回所写的最后一个字符;否则,返回EOF。
fgets()函数
格式:fgets(s,n,fp);
功能:用于从指定的文件中读一个字符串到字符数组中。其中,s可以是字符型数组名或字符串指针,n是指定读入的字符个数;fp为文件指 针。n是一个正整数,表示从文件中最多读取n-1个字符,并将字符串指针s定位在读入的字符串首地址。fgets()函数从文件中读取字符直到遇到回车符或EOF为止,函数会在最后一个字符后加上字符串结束标志’\0’;若有EOF,则不予保留。
返回值:该函数如果执行成功,返回读取字符串;如果失败,则返回空指针NULL,这时,s中的内容不确定。
fputs()函数和fgets()函数类似于puts和gets函数,可以仿照他们使用。
3.数据块的读写
fread()
格式:fread(char *ps,int len,int n,FILE *fp);
功能:用来指定文件中一次读取由若干个数据项组成的一个数据块,存放到指定的内存缓存区中,数据块的大小取决于数据块中数据项大 小(字节数)和数据项的个数。其中ps是用来指向存放数据块内存缓冲区的首地址,len是用来指出数据块中数据项的大小的整型数,fp是一个指向被操作 文件的指针。 fread()函数一次读取数据块的大小等于len与n的乘积。
举例:要从fp指针所指向的文件中一次读取500个整数,存放到内存的buf缓存中,可以用下列语句实现这一功能:
fread(buf,sizeof(int),500,file);
返回值:该函数正常返回值实际读取的数据项数,出错时返回NULL。
fwrite()
格式:fwrite(char *ps,int len,int n,FILE *fp);
功能:fwrite()函数用来将指定的内存缓冲区的数据块内的数据项写入指定的文件中。所写入的数据块的大小是由数据项的大小和数据项个数决定的。其中的参数同fread()函数类似。
返回值:该函数参数与fread()函数返回参数相同,函数正常返回值是实际写入文件中的数据项个数。
fread()和fwrite()函数一般用于二进制文件的操作。
4.格式化读写
fprintf()函数
格式:fprintf(fp, format, arg1, arg2,….,argn);
功能:fprintf()用来将输出项按指定的格式写入指定的文本文件中,其中格式化规定与printf()函数功能相似,所不同的只是fprintf()函数是将输出的内容写入文件中,而printf()函数则是在屏幕输出。其中,fp为文件指针,format为指定的格式控制字符串;arg1~argn为输出项,可以是字符、 字符串或各种类型的数值。该函数的功能是按格式控制字符串format给定的格式,将输出项arg1,arg2,…..,argn的值写入fp所指向的文件中。
返回值:如果函数执行成功,返回实际写入文件的字符个数;若出现错误,返回负数。
其实,fprintf()函数与printf函数一样的用法,只是在前面增加了一个发fp参数,即需要传入文件指针,printf是把字符按照格式打印到屏幕上,而fprintf是按照格式打印到文本中。
#include "stdio.h"
#include "stdlib.h"
void main()
{
FILE *file;
file = fopen("1.txt","r+");
if(file == NULL){
printf("文件打开错误!\n");
exit(0);
}
fprintf(file,"姓名 成绩 班级\n");
fprintf(file,"张三 78 1\n");
fprintf(file,"李四 88 2\n");
fclose(file);
}
那么在文本文件中会是
姓名 成绩 班级
张三 78 1
李四 88 2
fscanf()函数
格式:fscanf(fp,format,arg1,arg2,…..,argn);
功能:fscanf()用来按规定的格式从指定的文本文件中读取数据。它与scanf()函数的功能相似,都是按规定的格式读数据的函数,只是fscanf()函数读的对象不是键盘区,而是文件。其中,fp为文件指针,format为指定的格式控制字符串;arg1~argn为输入项的地址。该函数的功能是从文件指针fp所指的文本文件中读取数据,按格式控制字符串format给定的格式赋予输入项arg1,arg2,…..,argn中。
返回值:如果该函数执行成功,返回读取项目个数;如果遇到文件末尾,返回EOF;如果赋值失败,返回0.
例如,1.txt文件中存有下面内容
123 45 56
那么使用fscanf读取时
int i = 0;
fscanf(file,"%d",i);
那么i读到的值就是123
三、关闭文件
在程序里面,如果我们打开一个文件后,在完成文件的操作后一定要将其关闭,防止产生其他破坏性的操作,可以用fclose关闭
fclose(file);