fread与fwrite函数

本文详细介绍了fread和fwrite函数的使用方法及注意事项,并通过示例代码解释如何正确处理文件读写过程中的常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

 

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系统调用的读写函数readwrite是通过字节长度来读取和写入数据的。而库函数freadfwrite却需要确定读取或写入的元素的大小,以块为单位进行读写操作。实际上,库函数freadfwrite同样可以实现像系统调用readwrite那样的简化使用,只需将第二个参数始终填1就可以了。这样,第二个参数将表示以字节为单位读取或写入数据,第三个参数表示要读取或写入的字节数。

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值