目录
橙色
fread和fwrite
fread
从给定流 stream 读取数据到 ptr 所指向的数组中。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
- ptr — 这是指向带有最小尺寸
size*nmemb
字节的内存块的指针。 - size — 这是要读取的每个元素的大小,以字节为单位。
- nmemb — 这是元素的个数,每个元素的大小为 size 字节。
- stream — 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
- 成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。
fwrite
把 ptr 所指向的数组中的数据写入到给定流 stream 中
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
- ptr — 这是指向要被写入的元素数组的指针。
- size — 这是要被写入的每个元素的大小,以字节为单位。
- nmemb — 这是元素的个数,每个元素的大小为 size 字节。
- stream — 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
- 如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
简单的实例
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);
}