您的位置:首页 > 运维架构 > Linux

fread与fwrite函数

2013-05-05 17:41 141 查看
 

说明:只供学习交流,转载请注明出处

 

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就可以了。这样,第二个参数将表示以字节为单位读取或写入数据,第三个参数表示要读取或写入的字节数。

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 文件编程 Linux C C