我使用了fread函数,我得到了一个4的缓冲区和一个"读错误".
为什么我buffer不是fileSize?
这是我的代码:
FILE *fp;
char* buffer;
fp = fopen("help.txt","r");
if (fp == NULL){
fputs("Can't open Help file, Help.txt",stderr);
exit(1);
}
fseek(fp, 0, SEEK_END);
long fileSize = ftell(fp);
rewind(fp);
buffer = (char*) malloc (sizeof(char)*fileSize);
if(buffer == NULL){
fputs("Memory Allocation Error",stderr);
exit(2);
}
size_t result = fread(buffer,1,fileSize,fp);
if(result != fileSize){
fputs("Reading error\n",stderr);
printf("File Size : %lu\n",fileSize);
printf("Result : %lu\n",result);
printf("Buffer Size : %u\n",sizeof(buffer));
exit(3);
}
fputs(buffer,stdout);
fclose(fp);
free (buffer);
Run Code Online (Sandbox Code Playgroud)
这是我运行程序时的输出:
Reading error
File Size : 224
Result : 219
Buffer Size : 4
Run Code Online (Sandbox Code Playgroud)
buffer是一个char*.指针大小为4个字节(对于32位系统).因此sizeof(buffer)将始终打印4.
分配具有特定大小的指针后,它指向的内存块的大小就是您分配的内存块.在这种情况下,sizeof(char)*fileSize.
编辑哦,回答你真正的问题,在Windows中没有问题,ftell以字节为单位报告大小,将每个CRLF计为2个字节.当您在缓冲区中读取它时,CRLF将转换为单字节\ns,从而减小了生成的文本的大小.
(现在不在Windows上,无法检查.)