为什么我分配的缓冲区大小不合适?

L7C*_*ers 0 c++ file-io

我使用了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)

Mr *_*ter 5

buffer是一个char*.指针大小为4个字节(对于32位系统).因此sizeof(buffer)将始终打印4.

分配具有特定大小的指针后,它指向的内存块的大小就是您分配的内存块.在这种情况下,sizeof(char)*fileSize.

编辑哦,回答你真正的问题,在Windows中没有问题,ftell以字节为单位报告大小,将每个CRLF计为2个字节.当您在缓冲区中读取它时,CRLF将转换为单字节\ns,从而减小了生成的文本的大小.
(现在不在Windows上,无法检查.)