本期博客将介绍在C语言中进行文件操作的常见函数和基本方法,包括文件的基本概念、文件的打开和关闭、文件的读写操作、文件定位、文件检测等内容。
目录
一、文件的概念
文件是指存储在外部存储介质上具有名字的一组相关数据的集合。
C语言把文件中的数据看作一个字节序列,读写文件时形成一个输入输出的字节流。在“stdio.h"头文件中定义了三种标准流,其文件指针和默认连接外设如下:
标准流 | 文件指针 | 默认连接外设 |
标准输入 | stdin | 键盘 |
标准输出 | stdout | 显示器屏幕 |
标准错误输出 | stderr | 显示器屏幕 |
二、文件的分类
1.文本文件:
是以字符的ASCII码值存储与编码的文件,其内容就是字符,每个字符占一个字节,每个字节存储相应字符的ASCII码。(常用txt作为文件拓展名)
2.二进制文件:
以数据的二进制编码进行存储的文件。
三、文件类型指针
系统为每个正在使用的文件的内存中开辟了一个相应的文件信息区,存放文件有关信息。C语言将这些信息保存在一个结构体变量中,取名FILE。
在vs2022环境下FILE类型定义如下
struct _iobuf {
char* ptr;
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
};
typedef struct _iobuf FILE;
可以直接利用FILE类型定义一个指针变量
FILE*fp;
fp是一个指向FILE类型的指针变量,称为文件指针,fp指向文件的信息区,使fp与该文件关联。
四、文件的打开操作
fopen()函数,其一般格式如下:
FILE*fp;
fp=fopen(文件名,文件的打开方式);
如果打开成功则返回指向该文件的指针,否则返回空指针NULL。每次打开文件都应该判断打开成功与否。例如:
FILE*fp;
fp=fopen("myfile.txt","r");
if(fp==NULL)
{
printf("file open error!");
exit(0);
}
其中打开方式简单总结如下
t | 文本文件 |
b | 二进制文件 |
r | 从文件中读取数据 |
w | 向文件写数据 |
a | 文件末尾加数据 |
+ | 对文件可读可写 |
常见的打开方式有:
五、文件的关闭操作
fclose(文件指针)
文件关闭成功返回0;否则返回非0,关闭失败会导致数据丢失、文件破坏等随机错误。
六、文件的读写操作
1、字符读写函数
1.1 fputc()函数
用于向指定文件写入一个字符,格式如下:
fputc(字符,文件指针);
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE* fp;
char ch;
fp = fopen("myGreeting.txt", "w");
if (fp == NULL)
{
printf("file open error\n");
exit(0);
}
printf("please input a string:\n");
ch = getchar();
while (ch != '\n')
{
fputc(ch, fp);
ch = getchar();
}
fclose(fp);
return 0;
}
在当前目录下创建一个文本文件myGreeting.txt内容如下
1.2 fgetc()函数
用于从指定文件中读取一个字符,格式如下:
字符变量=fgetc(文件指针);
从文件指针所指向的文件中读取一个字符赋给字符变量,并将文件位置指针指向下一个字符。成功返回读取字符的ASCII码,出错或读到文件结束符返回EOF。举例:
char ch;
ch=fgetc(fp);
1.3 feof()函数
判断是否到文件尾可用ch!=EOF(仅适用于文本文件),还可以用feof函数。
feof(文件指针)
功能:当文件位置指针指向文件结束符时,返回非0值,否则返回0.
在程序的循环中,"!feof(fp)" 判断是否到文件末尾,若已到结束循环,否则继续读取字符并在屏幕上显示。
2、字符串读写函数
2.1 fputs()函数
用于向制定文件写入一个字符串,格式如下:
fputs(字符串,文件指针);
注意:写入成功返回0,否则返回EOF;字符串结束标志'\0'不写入文件。
2.3 fgets()函数
用于从指定文件中读取一个字符串,格式如下:
fputc(字符数组名,n,文件指针);
例如:
char s[10];
fgets(s,10,fp);
说明:1.字符数组名可用字符型指针变量代替。
2.最多读取n-1个字符,在读入最后一个字符后加上字符串结束标志'\0'。
3.在读满字符前遇到换行符或文件末尾EOF,读取结束。
3、格式化读写函数
3.1 fprintf()函数
用于按指定格式向文件中写入数据,格式如下:
fprintf(文件指针,格式控制字符串,输出列表);
功能:输出列表中的各变量或常量, 依次按格式控制字符串中控制符的格式写入文件指针所指向的文件中。成功返回值为写入文件中数据的字节数,否则返回EOF。
//用于将int类型变量n分别按%d,%x的格式写入fp所指向的文件中
int n=100;
fprintf(fp,"%d%x",n,n);
3.2 fscanf()函数
用于按指定格式从文件中读取数据,格式如下:
fcanf(文件指针,格式控制字符串,输入列表);
功能:从文件指针所指向的文件中按格式控制字符串中控制符读取相应数据赋给输入列表中对应的变量。成功返回已读取数据个数,否则返回EOF。
int x,y;
fscanf(fp,"%d %x",&x,&y);
4、数据块读写函数
4.1 fwrite()函数
用于将数据写到文件中,格式如下:
fwrite(buffer,size,count,fp);
功能:将从以buffer为首地址的内存中取出count次数据块(每次size个字节)写入fp所指向的文件中,如写入成功返回值为写入的数据块的个数,否则返回0。
//举例
int a[2]={100,200};
fwrite(a,4,2,fp);
4.2 fread()函数
用于从指定文件中读取一个指定字节的数据块,格式如下:
fread(buffer,size,count,fp);
功能:从fp指向的文件中读取count 次数据块(每次size个字节),并存储到Buffer所指向的存储空间中。如读取成功返回值为数据块的个数,否则返回0。
//举例
int b[2];
fread(b,4,2,fp);
七、文件定位函数
1.重置文件函数rewind()
对文件进行读写操作后文件的位置指针会移动,可用rewind()函数实现,格式如下:
rewind(文件指针);
注意:该函数没有返回值。
2.设置文件指针位置函数fseek()
fseek()函数, 用于将文件的位置指针移动到指定的位置,格式如下:
fseek(文件指针,位移量,起始位置);
说明:① fseek ()函数表示以"起始位置"为基点,将文件的位置指针向前或向后移动指定
的"位移量"。
②起始位置:既可以用符号常量表示,也可以用数字0、1、2表示,其含义如下:
起始位置 | 符号常量 | 数值 |
文件开始 | SEEK_SET | 0 |
当前位置 | SEEK_CUR | 1 |
文件末尾 | SEEK_END | 2 |
③位移量:表示移动的字节数。当其值为正数时,表示位置指针从"起始位置"开始向文件尾方向移动;当其值为负数时,表示位置指针从"起始位置"开始向文件头方向移动。位移量是 long 型数据,用数字表示时,可在数字 面加上后缀" L "。
④ fseek ()函数一般用于二进制文件。
//例如,假设文件指针 pf 指向二进制文件,以下是调用 fseek ()函数的几个例子:
fseek ( fp ,4L,0);//将位置指针移到距离文件头4字节处
fseek ( fp ,40L,1);//将位置指针移到当前位置后面40字节处
fseek ( fp ,-20L,2);//将位置指针从文件末尾处向文件头方向移动20字节
3.取当前位置函数
ftell ()函数用于获取文件位置指针的当前位置,其一般格式如下:
ftell (文件指针);
功能:获取文件指针所指向文件的当前位置指针的值,用相对于文件开头的位如果操作成功,则函数返回当前位置指针的值;如果出错,则返回﹣1L。
//例如,以下语句通过 fseek ()函数和 ftell ()函数求出文件大小:
fseek ( fp , OL , SEEK _ END );//把文件位置指针移到文件末尾
filelen=ftell(fp)//求出文件中的字节
八、文件检测函数
1.文件读写错误检测函数ferror()函数
在调用文件输入输出函数进行读写操作时,如果出现错误,除了可以检查这些函数的返回值外,还可以调用 ferror ()函数来确定具体出错的原因,其一般格式如下
ferror (文件指针);
功能:检测文件指针所指向文件在调用文件读写函数进行读写操作时是否出错,如果函数的返回值为0,表示未出错;如果返回非0值,表示出错,通过具体的错误代码值可以判别出错的原因。
注意:调用 fopen ()函数时, ferror ()函数的初始值自动置为0。
2.清除文件错误标志函数clearerr()函数
clearerr ()函数用于将文件错误标志和文件结束标志置为0,其一般格式如下:
clearerr (文件指针);
如果在调用一个文件读写函数时出现错误,则 ferror ( fp )函数值为一个非0值,通过调用 clearerr ( fp )可以清除错误标志,当再次调用 ferror ( fp )时,该函数将返回0。
本期博客对C语言中文件操作进行了全方位的简单讲解,可能会有误区,还请各位看客不吝赐教。
如果本博客对您有帮助的话请多多关注,博主持续更新中~