本文主要是介绍fread与fwrite函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
说明:只供学习交流,转载请注明出处
fread函数:
功能:从一个流中读取数据。
头文件 | #include <stdio.h> | |
函数原型 | int fread(void *ptr, int size, int nitems, FILE *stream); | |
返回值 | 成功 | 失败 |
读取的元素个数 | 0 |
参数说明:
ptr:用于接收数据的地址(指针)。
size:单个元素的大小,单位字节。
nitems:元素个数,即有多少个size大小的数据。
stream:提供数据的文件指针。
注意事项:在fread的文档中说了,对与返回值为0的情况,fread不区分到底是读到文件尾了,还是读取失败了。
看看如下代码存在的问题,假设fp为一个已经打开的可读文件流:
char buf[32] = {'\0'};while (fread(buf, 32, 1, fp) > 0){ printf("%s", buf);}
上面代码存在一个问题就是,如果文件长度不是32的整数
倍,始终不能输出整个文件。其原因就是最后一次读的时候没有读够一个数据元素(即不够32字节),那么本次返回0,自然不会输出了。
如果把代码修改成下面这样:
char buf[32] = {'\0'};while (fread(buf, 32, 1, fp) >= 0){ printf("%s", buf);}
结果导致了无限循环。归根结底就是在使用fread的时候没有区分错误或者文件结束。所以最终修改如下:
char buf[32] = {'\0'};while (fread(buf, 32, 1, fp) > = 0){ printf("%s", buf);if (feof(fp)) //读到文件结束符的时候feof返回真break;}
总结:在使用fread之类的文件块操作的时候一定要自己判断是否是读写错误还是遇到了结束符。
fwrite函数:
函数功能:向文件写入一个数据块。
头文件 | #include <stdio.h> | |
函数原型 | int fwrite(const void *buffer, size_t size, size_t count, FILE *stream); | |
返回值 | 成功 | 失败 |
成功写入的元素个数 | 0 |
参数说明:
ptr:是要输出数据的地址(指针)。
size:单个元素的大小,单位字节。
nitems:元素个数,既有多少个size大小的数据。
stream:提供数据的文件指针。
实例:
#include <stdio.h>
#include <string.h>int main(void)
{FILE *stream = NULL;char msg[] = "This is a test123!!";char buf[20] = {'\0'};if ((stream = fopen("test", "w+")) == NULL){fprintf(stderr,"Cannot open output file.\n");return (1);}fwrite(msg, strlen(msg), 1, stream);fseek(stream, 0, SEEK_SET);fread(buf, strlen(msg)+1, 1, stream);printf("%s\n", buf);fclose(stream);return (0);
}运行结果:
[root@localhost test]# ./fread
This is a test123!!
[root@localhost test]#
总结:
(1):要注意区分C库函数和Linux系统调用对文件操作的方法。比如C库函数fread的就没有像Linux系统调用read函数那样返回成功读取了多少字节。只有清楚了它们之间的区别我们才好熟练运用它们。
(2):Linux系统调用的读写函数read和write是通过字节长度来读取和写入数据的。而库函数fread或fwrite却需要确定读取或写入的元素的大小,以块为单位进行读写操作。实际上,库函数fread或fwrite同样可以实现像系统调用read和write那样的简化使用,只需将第二个参数始终填1就可以了。这样,第二个参数将表示以字节为单位读取或写入数据,第三个参数表示要读取或写入的字节数。
这篇关于fread与fwrite函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!