我正在尝试读取一个名为“binary.bin”的二进制文件,其中包含“this”的内容。我原本期望它分别给出“t”、“h”、“i”、“s”的 ASCII 值,但它给了我 5 个零。
void bin_byte_by_byte(char *filename) {
FILE *fptr;
unsigned long len;
int *buffer;
fptr = fopen(filename, "rb");
if(!fptr) {
printf("error: file does not exist");
return;
}
// get file lenght - create a function to this
fseek(fptr, 0, SEEK_END);
len = ftell(fptr);
fseek(fptr, 0, SEEK_SET);
buffer = (int*)malloc(sizeof(int) * len);
if(!buffer) {
printf("error: unable to allocate memory");
fclose(fptr);
return;
}
fread(&buffer, sizeof(buffer), len, fptr);
printf("len = %d\n", len);
for(int i = 0; i < len; i++) {
printf("%d ", buffer[i]);
}
if(fclose(fptr) != 0) {
printf("File did not close as expected");
}
free(buffer);
}
最佳答案
您的文件应该是二进制的,但似乎您将文本文件传递给了程序。该文件有 5 个字节,适合内容“this”。如果您以二进制形式读取此文件,则读取字节而不是整数也许是有意义的。如果要将字节读入 int 数组,则应按字节读取并将每个字节存储到 int 数组的一个位置。
您列出的程序中几乎没有错误。
buffer = (int*)malloc(sizeof(int) * len);
上面的行创建了一个 5 个整数的数组。因此,它需要 20 个字节(假设 32 位平台)。
然后你从文件中读取:
fread(&buffer, sizeof(buffer), len, fptr);
该行从文件中读取 20 个字节,尽管文件只有 5 个字节长。另外,您传递指针变量的地址,但需要传递缓冲区的地址。所以,它应该只是 buffer 而不是 &buffer
但要点是,buffer[0] 中有 4 个字节。因此,'t'、'h'、'i'、's' 转到缓冲区的第一个元素。
因此,您可以使用 char 作为数组类型,也可以逐字节读取并将每个字节存储到缓冲区的单独元素中
关于C:读取二进制文件输出零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50306013/