橙色
fread
从给定流 stream 读取数据到 ptr 所指向的数组中。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
size*nmemb
字节的内存块的指针。fwrite
把 ptr 所指向的数组中的数据写入到给定流 stream 中
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
简单的实例
fread(buf, size, nmemb, fp);
// 情况1:数据量足够
// 情况2:文件只有5个字节
// 读10个对象,每个对象1个字节
fread(buf, 1, 10, fp);
// 情况1:
// 第一次读:返回10(读到10个对象),读到10个字节
// 情况2:
// 第一次读:返回5(读到5个对象),读到5个字节
//--------------------------------
// 读1个对象,每个对象10个字节
fread(buf, 10, 1, fp);
// 情况1:
// 第一次读:返回1(读到1个对象),也读到10个字节
// 情况2:
// 第一次读:返回0(读不到1个对象,因为1个对象要10字节,而文件只有5个字节)
代码示例
用fread
和fwrite
代替fgtec
和fputc
:
特别注意,第32行fwrite中的第三个参数是n,因为读最后一次的时候不一定能读满SIZE个对象,所以fwrite的第三个参数应该是n,是实际读出的字节数,而不是SIZE。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 1024
int main(int argc, char **argv) {
FILE *fps, *fpd;
char buf[SIZE];
int n;
if(argc < 3) {
fprintf(stderr, "Usage:%s <src_file> <dest_file>\n", argv[0]);
exit(1);
}
fps = fopen(argv[1], "r");
if(fps == NULL) {
perror("fopen()");
exit(1);
}
fpd = fopen(argv[2], "w");
if(fpd == NULL) {
fclose(fps);
perror("fopen()");
exit(1);
}
// 如果成功读到n(n>0)个对象,则返回n
// 将这n个对象写入流中
while((n = fread(buf, 1, SIZE, fps)) > 0)
fwrite(buf, 1, n, fpd);
fclose(fpd);
fclose(fps);
exit(0);
}