我试图从.raw文件读取所有字节并使用fread将其存储在数组中。这是我的代码:
//open up card file
FILE* file = fopen("card.raw", "r");
if (file == NULL)
{
printf("Unable to open/create file\n");
return 1;
}
//size of file
fseek(file, 0, SEEK_END);
int size = ftell(file);
fseek(file, 0, SEEK_SET);
//buffer array
int buffer[size];
fread(&buffer, 512, size/512, file);
return(0);
我想一次读取512个字节以及文件中的所有内容。现在我的代码给了我Segmanetation Fault
,这是为什么?我想它与记忆泄漏或类似的东西有关,但我无法弄明白。我还尝试将文件file
的模式更改为w
,但随后所有文件内容都会消失。我做错了什么?
答案 0 :(得分:1)
因此您的代码存在一些问题:
size
和int buffer[size]
: size
是文件中的字节数,因此创建一个大小为size
的整数数组实际上是使用size * 4
个字节。您在评论中提到您的文件是14.3MB,因此buffer
数组将是57.2 MB。如果你真的想要读取4个字节的整数,那么你需要相应地调整buffer
数组的大小(除以4并考虑余数 - 稍后会更多)。ulimit -s
以查看堆栈上的最大千字节数。在我的机器上,这是8 MB,尝试将fread
放入更大的阵列会导致段错误。如果要将整个文件读入内存,则需要使用堆(malloc
/ free
)。size/512
:整数除法会抛弃余数,因此计算错误。buffer
的地址(您正在使用&buffer
)想要传递第一个地址buffer
的元素,只需使用buffer
(或&buffer[0]
即可轻松完成,但实际上很少见到这一点。)这是一个"工作"你的程序版本:
#include <stdio.h>
#include <stdlib.h>
#define BYTES_PER_READ 512
int main(int argc, char *argv[])
{
long size;
size_t number_of_ints;
size_t number_of_elements;
size_t read;
int *buffer;
/* Open up card file */
FILE *file = fopen("card.raw", "r");
if (!file) {
fprintf(stderr, "Unable to open/create file\n");
return 1;
}
/* Size of file */
fseek(file, 0, SEEK_END);
size = ftell(file);
fseek(file, 0, SEEK_SET);
/* 'size' is the number of bytes, not the number of ints,
so we need to adjust accordingly */
number_of_ints = (size % sizeof(int) ? 1 : 0) + (size / sizeof(int));
/* We want to read 512 bytes at a time, and we need to know
how many we need to read to consume the whole file
(this is identical to the calculation above) */
number_of_elements = (size % BYTES_PER_READ ? 1 : 0) +
(size / BYTES_PER_READ);
if (!(buffer = malloc(number_of_ints * sizeof(int)))) {
fprintf(stderr, "Failed to allocate memory\n");
return 1;
}
read = fread(buffer, BYTES_PER_READ, number_of_elements, file);
printf("I read %zu elements of size %d bytes (total bytes read: %zu)\n",
read, BYTES_PER_READ, read * BYTES_PER_READ);
free(buffer);
return 0;
}
如果你能描述你打算对buffer
数组的内容做些什么,有人可能会告诉你一个更好的方法去解决它(你现在阅读的方式有点奇怪.. 。)