1 文件流
保存在磁盘上的文件中的数据被定义为文件流。文件流不但包括了文件的真实数据还包含了文件目录、文件系统元数据、访问控制列表以及这个文件的扩展属性等。
在C语言中,用FILE结构来表示文件流。通过fopen()、fread()、fwrite()以及fprintf()等函数对文件流操作实现文件的读写。
2 常用的文件操作
2.1 打开/创建文件
通过fopen()函数实现文件的打开或创建。该函数的格式为
FILE* fopen(const char* path, const char* mode)
其中,参数path表示要打开或者创建的文件的路径;mode表示打开文件的方式,返回值是FILE结构的指针。
可以通过指定mode的值实现文件的创建或打开。其中,mode值是”r”时表示以只读的方式打开文件,如果文件不存在,则返回值是NULL;”r+”表示以可读可写的方式打开文件,如果文件不存在,则返回值是NULL;”w”表示以可写的方式打开文件,如果文件存在,则清空文件,如果文件不存在则创建文件;”w+”表示以可读可写的方式打开文件,如果文件存在,则清空文件,如果文件不存在则创建文件。
FILE* stream;
stream = fopen(“hou59tian.txt”, “w+”);
2.2 读取文件
通过fread()函数实现文件的读取。该函数的格式为
size_t fread(void* buff, size_t size, size_t count, FILE* stream)
其中,参数buff用来存储从文件中读取到的数据;size参数表示从文件流中读取的单个元素的大小,单位是字节;count表示从文件流中读取元素的个数;stream指定了文件流;返回值是从流中读取的元素个数。
char list[30];
int numread;
numread = fread( list, sizeof( char ), 25, stream );
2.3 写入文件
通过fwrite()函数实现文件的写入。该函数的格式为
size_t fwrite(const void* buff, size_t size, size_t count, FILE* stream)
其中,参数buff表示要写入的数据,size表示向文件流中写入的单个元素的大小,单位是字节;count表示最多向文件流中写入元素的数量;stream表示指定的文件流;返回值表示向文件流中实际写入的元素数量。
int numwritten;
for ( i = 0; i < 25; i++ )
list[i] = (char)('z' - i);
numwritten = fwrite( list, sizeof( char ), 25, stream );
2.4 关闭文件流
在对文件流进行了读写操作后,如不再需要操作文件流,则需要关闭该文件流。通过fclose()函数进行关闭,该函数可以把缓冲区内最后剩余的数据输出到文件中,并释放文件指针和有关的缓冲区。fclose()函数的格式为
int fclose(FILE *stream)
其中,stream即为要关闭的文件流,如果成功关闭文件流,则返回值是0,否则返回EOF。
fclose(stream);
3 数据的写入方式
通过文件流将输入写入文件时,主要包含两种写入方式:文本方式写入和二进制方式写入。
二进制方式写入文件是把内存中的数据按其在内存中的存储形式原样保存在文件中;而文本方式写入文件是把内存中的数据转化为字符,之后再保存到文件中。
3.1 fprintf()函数
在“2.3写入文件”中提到到fwrite()函数使用的是二进制方式写入,fprintf()函数使用的是文本方式写入。fprintf()函数的格式是
int fprintf(FILE *stream, const char *format [, argument ]... )
其中,参数stream是文件流,format是指定格式的字符串,argument是可选的参数。
3.2 两种写入方式的区别
对于二进制方式写入文件时(调用fwrite()函数),写入文件中的数据所占的空间是由fwrite()函数的第二个参数count决定的,如
int num = 10;
fwrite(&num, sizeof(int), 1, file);
此时,写入num的值10所占的空间是sizeof(int),也就是4个字节。而对于文本方式写入文件(调用fprintf()函数),
int num = 10;
fprintf(file, “%d”, num);
此时,写入num的值10所占的空间是2个字节。对于fwrite()函数,无论num的值是10、100、1000还是10000,此时写入的数据所占的空间都是4个字节,而对于fprintf(),写入10时所占的空间是2个字节,写入100时所占的空间是3个字节,写入1000时所占的空间是4个字节,写入10000时所占的空间是5个字节。
也就是说,对于二进制写入方式,无论写入的数值是大还是小,其所占的空间是固定的(由fwrite()函数的第二个参数决定);对于文本写入方式,写入的数值越小,其所占的空间越小,写入的数值越大,所占的空间越大。