文件分为数据文件和程序文件,下面讨论的是数据文件。
1.文件的打开和关闭
文件在打开时操作系统会形成一种结构体数据类型FILE(包含了文件大小哎,路径等等信息),我们可以使用指针指向这个来访问这个数据类型,实现间接来实现对文件的读写修改和删除。
其中FILE*就是文件类型指针,我们可以使用这个来进行访问文件,那么我们如何获取文件类型的指针使其指向文件信息结构体?我们就需要使用文件打开的库函数:fopen
FILE * fopen ( const char * filename, const char * mode );
该库函数返回的就是文件类型指针,我们就得到了指针。函数参数const char * filename是文件名是常量字符串(常量字符串就是首个的地址与char *相匹配), const char * mode是文件的打开模式(可以有读写修改等模式具体参照cplusplus网站)。其中文件的名查找的是程序所在的文件夹内,如果想要查找文件夹外就需要添加绝对路径,就是将原来文件名前面加上路径,并把单斜杠改成双斜杠。如果找不到就会返回空指针,注意检查。
下面是使用实例:
int main()
{
FILE* fl = fopen("text.txt", "w");
if (fl == NULL)
{
printf("%s", strerror(errno));
return 1;
}
return 0;
}
对于关闭文件就是将原来的指针给解放,指针失效了和防止形成野指针。下面是使用实例:
int main()
{
FILE* fl = fopen("text.txt", "w");
if (fl == NULL)
{
printf("%s", strerror(errno));
return 1;
}
fclose(fl);
fl=NULL;
return 0;
}
2.文件的操作
(1)文件的顺序读写
字符输入函数 fgetc 可以适应所有输入流,字符获取的库函数,可以将字符从文件中获取,在打开文件时要选择“r”模式。如果打开时文件不存在就创建一个新文件,如果文件里面有内容就是将其文件清空。
int fgetc ( FILE * stream );
返回的的是一个整形,就是这个字符的assic值,如果获取错误就会返回EOF;函数参数就是文件类型指针。一次只能获取一个字符。下面是使用示例:
字符输出函数 fputc 适用于所有输出流,写入是一个一个写入,打开文件时要选择“w”模式。如果打开时文件不存在就创建一个新文件,如果文件里面有内容就是将其文件清空。
int fputc ( int character, FILE * stream );
返回的是整形是写入的字符,如果写入错误就会返回EOF。函数参数int character是输入的字符,FILE * stream是文件类型指针,使用实例如下:
文本行输入函数 fgets适用于所有输入流,获取文件数据是一行一行的获取的。
char * fgets ( char * str, int num, FILE * stream );
返回值是字符串的首地址,如果获取失败就会返回空指针。函数参数char * str是存放获取的字符串,int num是获取的字符串大小,FILE * stream是文件类型指针。下面是使用实例
由于函数指针 int num是包含字符串中的\0所以使用时要关注\0的特殊情况。
文本行输出函数 fputs 适用于所有输出流,是一行一行的写入字符串。
int fputs ( const char * str, FILE * stream );
返回值是非负值,如果错误就返回EOF。下面是使用实例;
格式化输入函数 fscanf 适用于所有输入流,可以以一定的格式获取数据。
int fscanf ( FILE * stream, const char * format, ... );
返回的参数个数,函数参数是FILE * stream是文件类型指针,后面的参数就是scanf的参数,下面是使用实例:
格式化输出函数 fprintf 适用于所有输出流,可以将文件以不同格式输入到文件中。
int fprintf ( FILE * stream, const char * format, ... );
返回的参数个数,函数参数是FILE * stream是文件类型指针,后面的参数就是printf的参数,下面是使用实例:
二进制输入 fread 只适用于文件,以二进制的形式获取文件数据。
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
返回的是实际上读取的字节数;函数参数 void * ptr存放获取的地址,size是每个元素的大小,size_t count是获取元素的个数。下面是使用实例:
二进制输出 fwrite 适用于文件,以二进制形式写入文件中。
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
返回的是实际上读取的字节数;函数参数 void * ptr存放获取的地址,size是每个元素的大小,size_t count是获取元素的个数。下面是使用实例:
sscanf/sprintf
sprintf就是将格式数据去格式化后变成字符串后存入变量中;
int sprintf ( char * str, const char * format, ... );
函数参数const char * s就是所需要存入的字符串的变量,下面是使用示例:
sscanf就是通过一个字符串来获得格式化信息
int sscanf ( const char * s, const char * format, ...);
函数参数const char * s就是所需要格式化的字符串,后面存入数据中,下面是使用示例:
(2)文件的随机读写
fseek根据文件指针的位置和偏移量来定位文件指针,就是将文件指针定位到某个位置根据起点和偏移量(起点的右为正,起点左为负)。文件起点有SEEK_SET(起点),SEEK_CUR(指针目前位置),SEEK_END(文件末尾)
int fseek ( FILE * stream, long int offset, int origin );
函数参数中FILE * stream是文件类型指针, long int offset是偏移量,int origin是起点
ftell 返回文件指针相对于起始位置的偏移量,就是将文件指针的偏移量返回
long int ftell ( FILE * stream );
返回值就是偏移量。
rewind 让文件指针的位置回到文件的起始位置,就是让指针恢复到原位置。
void rewind ( FILE * stream );
3.文件读取结束的判定
文件的读取结束有两种可能,一种是因为出现错误,第二种是文件读取到文件的结束
对于文件的读取判定,不同库函数判断的形式不同:
fgetc 判断结束是否为 EOF .
fgets 判断返回值是否为 NULL .
fread判断返回值是否小于实际要读的个数。
如果出现上面的情况,我们就要进行判断错误究竟是什么原因
feof是判断是不是文件的结束引起的错误,如果是返回值为真
同样地,ferror是判断是不是文件的读取错误引起的错误,如果是返回值为真。
下面是使用示例: