fread() 只将第一个字符复制到目标缓冲区

fread() only copies the first character into the target buffer

我想读取 .txt 文件的内容并将其存储在缓冲区中。 要读取文件,我使用 fread().

manpage 说:

" On success, fread() and fwrite() return the number of items read or written. This number equals the number of bytes transferred only when size is 1."

我遇到的问题是,在下面的代码中,函数调用返回了 216 个字节。但在最终缓冲区中,内容仅包含一个字符。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool readFile(const char* pFileName, char* outFile) {
    FILE* myFile;
    myFile = fopen(pFileName, "r");
    if (myFile == NULL) {
        printf("File could not be opened.");
        return false;
    }

    printf("Size of my file: %d\n",sizeof(*myFile));
    printf("Size of output buffer %d\n",sizeof(outFile));
    printf("sizeof(*outFile) / sizeof(outFile) %d\n",sizeof(*myFile) / sizeof(myFile[0]));
    size_t res = fread(outFile, sizeof(*outFile), sizeof(*outFile)/sizeof((outFile)[0]), myFile);
    printf("freadResult: %d\n", res*sizeof(*myFile));
    fclose(myFile);

    return true;
}

int main(){

    char* fileName = "test.txt"; 
    char* outFile = (char*)malloc(4096);

    bool result = readFile(fileName, outFile);
    if(!result){
        printf("Error\n");
    } else {
        printf("Success\n");
        for(char* tmp = outFile; *tmp != '[=10=]' ; ++tmp){
            printf("%c", *tmp);
        }
        printf("\n");
    }
    printf("Programm finished\n");
    return 0;
}

test.txt文件有以下三行内容:

I was
opened
successfully!

如果我构建并执行 readFileTest,我会得到以下输出:

$ gcc readFileTest.c -o readFileTest
$ ./readFileTest 
>Size of my File: 216
>Size of output Buffer 8
>sizeof(*outFile) / sizeof(outFile) 1
>freadResult: 216
>Success
>I
>Programm finished

这一行

size_t res = fread(outFile, sizeof(*outFile), sizeof(*outFile)/sizeof((outFile)[0]), myFile);

表达式sizeof(*outFile)等价于表达式sizeof(char)(变量outFile的类型是char *所以表达式*outFile的类型与 outFile[0] 相同的是 char) 并且等于 1。同时表达式 sizeof(*outFile)/sizeof((outFile)[0]) 等价于 sizeof(char)/sizeof(char ) 而 a;so 等于 1.

您需要将动态分配数组的实际大小传递给函数并在函数内使用它。

注意 sizeof 运算符的输出值,您必须在 printf 的调用和此调用中使用转换说明符 zu 而不是 d

printf("Size of my file: %d\n",sizeof(*myFile));

表达式 sizeof(*myFile) 产生结构的大小 FILE。这不是文件的大小。