文件分为文本类文件和二进制文件两种,若要对文件进行读写操作,首先要打开文件:
一. 文件打开函数
FILE * fopen(const char *filename,const char *mode)
该函数返回值为文件句柄,可以通过文件句柄对文件进行操作。
注意:一定要判断文件打开是否成功,只有成功了才可以进行以下的操作
filename:表示要打开的文件名
mode:表示文件的打开方式,下面列举几种常用的文件打开方式:
r:以只读方式打开,如果要打开的文件不存在,则打开失败
r+:以读写的方式打开,如果要打开的文件不存在,则打开失败
w:以只写的方式打开,如果要打开的文件不存在,就创建该文件
w+:以读写的方式打开,如果要打开的文件不存在,就创建该文件
a:以追加写的方式打开,即该文件的末尾处开始写,如果要打开的文件不存在,就创建该文件
a+:以读写的方式打开,从头开始读,从尾开始写,如果要打开的文件不存在,就创建该文件
然后,对文件进行读写操作,读写操作函数又分为两大类:文本类文件读写和二进制文件读写。
二. 文本类文件读写
1. 未格式化I/O
(1)字符I/O函数
int getchar();//从标准输入流(键盘)读取字符
int putchar(int c);//将字符c写入标准输出流(屏幕)
int getc(FILE *stream);//从文本流stream中读取字符,将stream替换为标准输入流(stdin)即为函数getchar
int putc(int c,FILE *stream);//将字符c写入文本流stream中,若把stream替换为标准输出流(stdout),即为putchar函数
另外,fgetc,fputc函数与getc,putc的参数和作用相同。
(2)行I/O函数
char *gets(char *str);//从标准输入流(键盘)中读取一行字符串,存入字符串str中
int puts(const char* str);//将字符串str写入标准输出流(屏幕)中
char *fgets(char *str,int num,FILE*stream);//从文本流stream中读取num个字符放入字符串str中,将stream替换为stdin与函数gets的效果相同
int fputs(const char *str,FILE*stream);//将字符串str写入文本流stream中,将stream替换为stdout与函数puts的效果相同
2. 格式化I/O
(1)I/O到标准流
int scanf(const char *format,...);//从标准输入流(stdin)中格式化(按format指定的格式)的读取内容
int printf(const char *format,...);//将格式化(格式有format指定)后的内容输出到标准输出流(stdout)中
如:
scanf("%d",&n);//从键盘读取一个整数赋给变量n
printf("%s",str);//将字符串输出到屏幕上
(2)I/O到文件中
int fscanf(FILE *stream,const char *format,...);//从文本流stream中格式化读取内容
int fprintf(FILE *stream,const char *format,...);//将内容格式化写入文本流stream中
(3)I/O到字符串或数组中
int sscanf(char *str,const char *format,...);//按format指定的格式从str中读取内容
int sprintf(char *str,const char *format,...);//按格式format将内容写入str中
三. 二进制I/O
size_t fread(void *str,size_t size,size_t count,FILE *stream);
//从stream中读取count个基本单元,一个单元有size字节的内容到str中
//该函数的返回值是实际读取到的count数
size_t fwrite(const void *str,size_t size,size_t count,FILE *stream);
//将str中的内容写count个单元,一个单元size个字节的内容到stream中
//该函数的返回值是实际写入的count数
如果读取文件时,实际返回的count数与原设定的count数不同,则读取或写入的内容到达结尾或出错。可以根据下面两个函数进行判断:
int feof(FILE *sream);//检查读取文件是否到达结尾,若到达,返回非零值1,否则返回0
int ferror(FILE *stream);//检查文件的读取是否出错,若出错,返回非零值1,否则,返回0
四,判断文件的大小
1.
int fseek( FILE *stream, long offset, int origin );//设置文件的读写位置
其中,stream为文件句柄,
origin为三个值之一:SEEK_SET(文件开头),SEEK_CUR(当前位置),SEEK_END(文件结尾)
offset:偏移值
该函数的作用是将文件的读写位置设定在距origin指定的值偏移量为offset处。
2.
long ftell(FILE *stream);
该函数的作用是返回文件stream从开头到该文件读写位置所在处的字节数
3.
rewind(FILE *stream);
该函数的作用是将文件的读写位置设置在开头处。
所以,在不改变文件(文件句柄为stream)读写位置的前提下,获取文件的大小,可以使用以下方法:
fseek(stream,0,SEEK_END);
long lsize=ftell(stream);
rewind(stream);
五,关闭文件
在对文件进行读写操作结束后,就要关闭文件。
int fclose(FILE *stream);//关闭成功返回1,不成功,返回0