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

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


如果将第三个参数设为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;  
}  



这段代码可能是一个文件复制程序,具体解释如下: ```c #include <stdio.h> int main() { FILE *from, *to; from = fopen("source_file.txt", "rb"); // 打开源文件 to = fopen("destination_file.txt", "wb"); //打开目标文件 if (from && to) { // 判断两个文件是否都成功打开 unsigned char buffer[1024]; // 定义一个缓冲区 size_t n; while ((n = fread(buffer, 1, sizeof(buffer), from)) > 0) { // 从源文件中读取数据到缓冲区中 fwrite(buffer, 1, n, to); // 将缓冲区中的数据写入到目标文件中 } fclose(from); // 关闭源文件 fclose(to); // 关闭目标文件 } return 0; } ``` - `FILE* from`和`FILE* to`是指向文件指针的指针,它们用于存储打开的源文件和目标文件的地址。 - `fopen`函数用于打开文件,第一个参数是文件名,第二个参数是打开方式,"rb"表示以二进制读取方式打开文件,"wb"表示以二进制写入方式打开文件。 - `from && to`用于判断源文件和目标文件是否都成功打开。如果其中一个文件打开失败,就无法进行文件复制操作。 - `fread`函数用于从文件中读取数据,第一个参数是缓冲区的地址,第二个参数是每个数据块的大小,第三个参数是读取的数据块数目,第四个参数是文件指针。`fread`函数返回值是实际读取的数据块数目。 - `fwrite`函数用于将数据写入文件,第一个参数是缓冲区的地址,第二个参数是每个数据块的大小,第三个参数是写入的数据块数目,第四个参数是文件指针。 - `unsigned char buffer[1024]`定义了一个缓冲区,用于存储从源文件中读取的数据。 - `sizeof(buffer)`表示缓冲区的大小,也就是1024字节。`fread`函数每次最多读取1024字节的数据。 - `fclose`函数用于关闭文件,释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值