fread/fwrite第二个参数和第三个参数的区别以及与返回值的关系

51 篇文章 0 订阅

两者是块读写的方式,第二个参数是单个块的大小,第三个参数是块的个数,返回值是实际读写的块的个数,而不是字节数。

如果将第三个参数设为1,那么如果fread读到的字节数小于第二个参数,则fread返回值为0。

这个问题很容易搞错,并导致很多问题,需要强调的是fread函数返回的并不是字节数。

realRead = fread(buf,item,count,fp)    (每次读item大小的数据块,分count次来读。)

而是返回的是成功有效的读取的item元素的个数,而成功读入的字节数则是realRead * sizeof(item)

一般说来realRead 是小于count的,很巧的情况就刚好为count.除非文件大小刚好为item大小的整数倍。

返回的是真实读入item元素的个数,虽然读了count次,但是真正读到的有效个数为realRead个
真实读入字节数就为realRead*sizeof(item)  

fread(从文件流读取数据) 

表头文件  #include<stdio.h>

定义函数  size_t fread(void * ptr,size_t size,size_t count,FILE * stream);

函数说明  fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字节数以参数size*count来决定。
Fread()会返回实际读取到的count数目,如果此值比参数count来得小,则代表可能读到了文件尾了或者有错误发生(前者几率大),这时必须用feof()或ferror()来决定发生什么情况。

返回值  返回实际读取到的count数目。

fread返回的不是字节数,

当且仅当下面这么用的时候,返回值才是字节数(当然因为恰好一个数据块大小为1个字节,相当于realRead*1)

char buff[size];
FILE *fp;
...
realRead = fread(buff, 1, size, fp);
...

如果是: fread(buff, size, 1, fp)
返回1表示读取了size字节,返回0表示读取数量不够size字节

参考源代码如下:

int main()
{
    char buf[FILE_RW_BUFFER_SIZE];
    int readSize = 0;
    int writeSize = 0;

    FILE *traceFd = fopen("./test.tce", "a+");
    FILE *pp = popen("ls", "r");
    if (NULL == pp) {
        printf("open pipe for command failed!\n");
        return -1;
    }

    do {
        readSize = fread(buf, 2, 512, pp); //48
        //readSize = fread(buf, 1, FILE_RW_BUFFER_SIZE, pp); //98
        //readSize = fread(buf, FILE_RW_BUFFER_SIZE, 1, pp); //0
        printf("readSize is %d!\n", readSize);

        //writeSize = fwrite(buf, 1, readSize, traceFd); //49
        //writeSize = fwrite(buf, 2, readSize, traceFd); //49 file complete
        writeSize = fwrite(buf, readSize, 2, traceFd); //2 file complete
        writeSize = fwrite(buf, readSize, 3, traceFd); //2 file complete
        printf("writeSize is %d!\n", writeSize);
    } while(FILE_RW_BUFFER_SIZE == readSize);

    fclose(traceFd);
    pclose(pp);
    return 0;
}


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是什么? A:fread函数的第二个参数是用于存储读取数据的缓冲区的地址,第三个参数是要读取的每个元素的大小(以字节为单位)。例如,如果要读取10个int类型的数据,则第三个参数应为sizeof(int),以确保每个int类型的数据都可以正确地读取。 ### 回答2: fread函数是C语言中用于从文件中读取数据的函数,其函数原型为: size_t fread(void *ptr, size_t size, size_t count, FILE *stream) 其中,第一个参数ptr指向一个用来存储读取数据的缓冲区,这个缓冲区可以是任意类型的指针。第二个参数size表示要读取的每个数据项的字节数,通常用sizeof(type)来获取类型的字节数,其中type是要读取的数据项的类型。 第三个参数count表示要读取的数据项的个数,通常用要读取的字节数除以每个数据项的字节数来计算。最后一个参数stream是一个指向FILE对象的指针,它表示要读取的文件流。 通过这样的参数组合,fread函数可以根据指定的大小和数量从文件流中读取数据,并将读取的数据存储到提供的缓冲区中。它返回实际成功读取的数据项个数,如果返回小于count,则可能是遇到了文件尾或者读取过程中出现了错误。 举个例子来说明,假设有一个包含整型数据的文件data.txt,并且我们希望从文件中读取4个整数到一个int类型的数组中。我们可以这样使用fread函数: ```c int data[4]; FILE *file = fopen("data.txt", "rb"); // 以二进制模式打开文件 if (file != NULL) { size_t num_items = fread(data, sizeof(int), 4, file); printf("Actual items read: %zu\n", num_items); fclose(file); } ``` 在上面的示例中,我们打开了data.txt文件,并以二进制模式打开文件流。然后我们使用fread函数将4个整数数据按照每个整数4个字节的大小读取到data数组中,并通过printf函数输出实际读取到的数据项个数。 通过理解和正确使用fread函数的参数,我们可以高效地从文件中读取所需的数据。 ### 回答3: fread是C语言中的一个文件读取函数,它的第二个参数和第三个参数分别是读取单个数据元素的大小和要读取的数据元素的个数。 第二个参数指定了每个数据元素的大小,它是一个整数。通常情况下,我们可以使用sizeof运算符来获取数据元素的大小。例如,如果我们要读取一个整型数组,那么可以将sizeof(int)作为第二个参数传入fread函数中。 第三个参数指定了要读取的数据元素的个数,它也是一个整数。我们可以根据实际需求来确定要读取的数据元素的个数。如果我们想读取整个文件,可以将第三个参数设置为文件的大小除以每个数据元素的大小。 在使用fread函数时,通常我们会通过一个指针来接收读取到的数据,并将读取到的数据存储到指定的内存位置中。因此,我们需要注意确保接收数据的指针所指向的内存空间足够大,可以容纳读取到的数据。 总结起来,fread函数的第二个参数表示每个数据元素的大小,第三个参数表示要读取的数据元素的个数。通过这两个参数的设置,我们可以从文件中读取指定大小和数量的数据,并将其存储到指定内存位置中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值