fread函数和fwrite函数

目录

  • fread和fwrite

橙色

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 参数不同,则可能发生了一个错误或者到达了文件末尾。

fwriteptr 所指向的数组中的数据写入到给定流 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个字节)

代码示例

freadfwrite代替fgtecfputc

特别注意,第32行fwrite中的第三个参数是n,因为读最后一次的时候不一定能读满SIZE个对象,所以fwrite的第三个参数应该是n,是实际读出的字节数,而不是SIZE。

#include 
#include 
#define SIZE 1024

int main(int argc, char **argv) {

    FILE *fps, *fpd;
    char buf[SIZE];
    int n;

    if(argc < 3) {
        fprintf(stderr, "Usage:%s  \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);
}

你可能感兴趣的:(#,Linux系统编程入门,linux)