【问题】fread读到的数据是0

现象:今天在使用fread读一块很大的buffer时,只有前面几个字节有内容,后面的数据都是0.

原因:fread,fwrite函数都是以二进制读写的,调用fopen时也需要以二进制的方式打开"rb"/"wb"。

以下是使用系统调用read和write实现文件复制的C语言程序: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int input_fd, output_fd; // 输入和输出文件描述符 ssize_t ret_in, ret_out; // 读取和写入字节数 char buffer[BUF_SIZE]; // 缓冲区 if(argc != 3){ printf("Usage: %s file_origin file_target\n", argv[0]); return 1; } // 打开输入文件,如果出错则输出错误信息并退出程序 input_fd = open(argv[1], O_RDONLY); if(input_fd == -1){ perror("open"); return 2; } // 打开输出文件,如果出错则输出错误信息并退出程序 output_fd = open(argv[2], O_WRONLY | O_CREAT, 0644); if(output_fd == -1){ perror("open"); return 3; } // 循环读取输入文件,并写入输出文件,直到读取完毕 while((ret_in = read(input_fd, buffer, BUF_SIZE)) > 0){ ret_out = write(output_fd, buffer, (ssize_t) ret_in); if(ret_out != ret_in){ // 如果写入字节数不等于读取字节数,则输出错误信息并退出程序 perror("write"); return 4; } } // 如果读取出错,则输出错误信息并退出程序 if(ret_in == -1){ perror("read"); return 5; } // 关闭文件描述符 close(input_fd); close(output_fd); return 0; } ``` 以下是使用文件的库函数fread和fwrite实现文件复制的C语言程序: ```c #include <stdio.h> #include <stdlib.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { FILE *input_fp, *output_fp; // 输入和输出文件指针 size_t ret; // 读取字节数 char buffer[BUF_SIZE]; // 缓冲区 if(argc != 3){ printf("Usage: %s file_origin file_target\n", argv[0]); return 1; } // 打开输入文件,如果出错则输出错误信息并退出程序 input_fp = fopen(argv[1], "rb"); if(input_fp == NULL){ perror("fopen"); return 2; } // 打开输出文件,如果出错则输出错误信息并退出程序 output_fp = fopen(argv[2], "wb"); if(output_fp == NULL){ perror("fopen"); return 3; } // 循环读取输入文件,并写入输出文件,直到读取完毕 while((ret = fread(buffer, 1, BUF_SIZE, input_fp)) > 0){ fwrite(buffer, 1, ret, output_fp); } // 如果读取出错,则输出错误信息并退出程序 if(ferror(input_fp)){ perror("fread"); return 4; } // 关闭文件指针 fclose(input_fp); fclose(output_fp); return 0; } ``` 使用time命令测试两个程序的执行时间: ``` $ time ./copy_readwrite input.txt output.txt real 0m0.002s user 0m0.001s sys 0m0.001s $ time ./copy_freadfwrite input.txt output.txt real 0m0.001s user 0m0.000s sys 0m0.001s ``` 可以看出,使用文件的库函数fread和fwrite实现文件复制的程序执行时间更短,效率更高。这是因为文件的库函数fread和fwrite可以利用缓冲区,一次读取或写入多个字节,减少系统调用的次数,从而提高程序的效率。而使用系统调用read和write实现文件复制的程序则没有利用缓冲区,每次仅读取或写入一个字节,需要进行多次系统调用,效率较低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值