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
。这不是文件的大小。
我想读取 .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
。这不是文件的大小。