I/O函数以三种基本的形式处理数据:单个数据、文本行和二进制数据。
1.fopen函数 (打开一个特定的文件)
形式:
FILE * fopen(char const* name,char const* mode)
参数:
name:
希望打开的文件或设备的名字
mode:
r : 为读而打开的文本文件 。(文件不存在则错误)
w :为写而打开的文本文件(文件存在则原来的内容删除,不存在则创建)
a :添加 (文件存在从文件尾进行添加,不存在则创建)
r+:为读和写而打开的文本文件(读时从头开始,写时新数据只覆盖所占空间其后不变)
w+:首先建立一个新文件,进行写操作,随后可以从头开始读.(若文件存在,原内容将全部消失)
a+:在文件尾部添加新的数据后,可以从头开始读.
同理rb+、wb+、ab+,只是可以由位置函数设置其读写的位置
注:
fopen函数执行成功,会返回一个指向FILE结构的指针,执行失败会返回一个NULL指针。所以应始终检查函数的返回值。
2.fclose函数(关闭文件)
形式:
int fclose(FILE * f)
fclose()函数在文件执行前刷新缓冲区,执行成功返回0,执行失败返回EOF.
3.字符IO
字符输入:
int fgetc(FILE* stream)
int getc(FILE* stream)
int getchar(void) 从标准输入读取字符
字符输出:
int fputc(int character, FILE *stream);
int putc(int character,FILE *stream);
int putchar(int character);
4.字符串操作
char* fgets(char* buffer,int buffer_size,FILE* stream);
fgets从指定的stream读取字符并把它们复制到buffer中。当它读取一个换行符并存储到缓冲区之后就不在读取
int fputs(char const* buffer,FILE* stream);
fputs函数必须包含一个字符串,它的字符被写入到流中。
5.二进制I/O
把数据写入到文件效率最高的方法是用二进制形式写入。二进制输出避免了在数值转换为字符串过程中所涉及的开销和精度损失。(只有当数据被另一个程序按顺序读取时才能使用)
size_t fread(void *buffer,size_t size,size_t count,FILE* stream);
size_t fwrite(void* buffer,size_t size,size_t count,FILE* stream);
参数:
fread函数用于读取二进制数据,fwrite函数用于写入二进制数据。
buffer是一个指向用于保存数据的内存位置的指针
size是缓冲区中每个元素的字节数,
count是读取或写入的元素数()读取或写入一个标量时,count的值应为1.
函数返回值是实际读取或写入元素的数目。
6.定位函数
(1) long ftell(FILE* stream); fell函数返回流的当前位置(也就是,下一个读取或写入将要开始的位置距离文件起始位置的偏移量)。 在二进制流中,这个值就是当前位置距离文件起始位置之间的字节数。
(2)int fseek(FILE* stream,long offset,int from);
注:在二进制流中,从SEEK_END可能不被支持,应避免。在文本流中,from是SEEK_END或SEEK_END,offset必须为零,如果from是SEEK_SET,offset必须是一个从同一个流中以前调用ftell所返回的值。
(3) void rewind(FILE *stream);
rewind函数将读/写指针设置回指定流的起始位置。
7.文件结束函数feof
int feof(FILE* stream);
EOF可以作为文本文件的结束标志,但不能作为二进制文件的结束符。feof函数即可以判断二进制文件,又可判断文本文件。
参考:《C和智能》第十五章 输入/输出函数