从文件读取字节并存储在数组-C中

时间:2014-10-14 20:47:28

标签: c file-io

我试图从.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,但随后所有文件内容都会消失。我做错了什么?

1 个答案:

答案 0 :(得分:1)

因此您的代码存在一些问题:

  1. sizeint buffer[size] size是文件中的字节数,因此创建一个大小为size的整数数组实际上是使用size * 4个字节。您在评论中提到您的文件是14.3MB,因此buffer数组将是57.2 MB。如果你真的想要读取4个字节的整数,那么你需要相应地调整buffer数组的大小(除以4并考虑余数 - 稍后会更多)。
  2. 堆栈大小:大多数系统都限制堆栈。如果您在Linux上编写/运行此命令,请尝试在命令行键入ulimit -s以查看堆栈上的最大千字节数。在我的机器上,这是8 MB,尝试将fread放入更大的阵列会导致段错误。如果要将整个文件读入内存,则需要使用堆(malloc / free)。
  3. size/512整数除法会抛弃余数,因此计算错误。
  4. 错别字/其他:您不想传递buffer的地址(您正在使用&buffer)想要传递第一个地址buffer的元素,只需使用buffer(或&buffer[0]即可轻松完成,但实际上很少见到这一点。)
  5. 这是一个"工作"你的程序版本:

    #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数组的内容做些什么,有人可能会告诉你一个更好的方法去解决它(你现在阅读的方式有点奇怪.. 。)