关于fread读不满一块和读不满count的返回值

#include <iostream>
#include <string>
#include <cstdint>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void make_test_file(const char* path)
{
    FILE* fp = fopen(path, "wb");
    if (!fp) {
        perror("fopen write");
        exit(1);
    }

    // 写 700 字节,方便演示“512 字节整块 + 剩余 188 字节”
    for (int i = 0; i < 300; i++) {
        unsigned char c = (unsigned char)(i & 0xFF);
        fwrite(&c, 1, 1, fp);
    }

    fclose(fp);
}

static void demo_size_512_count_1(const char* path)
{
    unsigned char buf[512];
    FILE* fp = fopen(path, "rb");
    if (!fp) {
        perror("fopen rb");
        exit(1);
    }

    size_t ret1 = fread(buf, 512, 1, fp);
    printf("[size=512,count=1] first read ret=%zu\n", ret1);

    size_t ret2 = fread(buf, 512, 1, fp);
    printf("[size=512,count=1] second read ret=%zu, feof=%d, ferror=%d\n",
        ret2, feof(fp), ferror(fp));

    fclose(fp);
}

static void demo_size_1_count_512(const char* path)
{
    unsigned char buf[512];
    FILE* fp = fopen(path, "rb");
    if (!fp) {
        perror("fopen rb");
        exit(1);
    }

    size_t ret1 = fread(buf, 1, 512, fp);
    printf("[size=1,count=512] first read ret=%zu\n", ret1);

    size_t ret2 = fread(buf, 1, 512, fp);
    printf("[size=1,count=512] second read ret=%zu, feof=%d, ferror=%d\n",
        ret2, feof(fp), ferror(fp));

    fclose(fp);
}

int main(void)
{
    const char* path = "test.bin";

    make_test_file(path);

    demo_size_512_count_1(path);
    demo_size_1_count_512(path);

    return 0;
}

msvc windows 结果

[size=512,count=1] first read ret=0
[size=512,count=1] second read ret=0, feof=1, ferror=0
[size=1,count=512] first read ret=300
[size=1,count=512] second read ret=0, feof=1, ferror=0

 

X86结果:

[size=512,count=1] first read ret=0
[size=512,count=1] second read ret=0, feof=1, ferror=0
[size=1,count=512] first read ret=300
[size=1,count=512] second read ret=0, feof=1, ferror=0

posted on 2026-06-02 16:28  邗影  阅读(2)  评论(0)    收藏  举报

导航