将二进制文件加载到数组中

时间:2014-01-08 23:24:19

标签: c arrays file binary

我无法将文件.dat加载到数组中。 我有一个创建了一个结构并在程序中加载了该文件。

我想我需要使用循环来浏览文件并使用fread获取数据outta文件并放入数组中。

如果您猜不到,该文件是二进制文件!:)

/* Libary collections required */

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

/* The user must be able to make a selection between printing out the CD list with
   either the track lists or without. Which will be done using a switch case.. later*/

typedef struct CDFull
{
    char CDTitle[50];
    char Artist[50];
    int NumberOfTracks;
    int TrackNumber;
    char TrackName[50];
    float TrackLength;
}CDF;

int _tmain(int argc, _TCHAR* argv[])
{
    /* Checking whether or not the file has been loaded.
       Prints a different output dependant on the result */

    FILE * file = fopen("test.dat","rb");

    if(!file)
    {
        printf("We are unable to read the file!");
    }

    else if(file)
    {
        printf("The file has successfully loaded!");
    }

    /* Load the file into a array data structure */

    /* I need to create a array calling in the data from the file inside a loop.
       ending the read when the file is null/empty/whitespace */

    CDF myCData[51];  
    for(int i = 0; i < 51; i++)
    {
    fread(&myCData[i], sizeof(CDF), 1,file);
    }

    fclose(file);
    getchar();
    return 0;   

}

希望足够清楚,我已经连续数小时没有任何成功

感谢您提前回复。

编辑:添加了BLUEPIXY所说的:它编译,但是,我需要打印出数组以检查数据是否已加载..我们将看到嘿嘿!

1 个答案:

答案 0 :(得分:0)

在我看来,您的代码存在以下问题。

内存分配

对于看起来像一个相当大的文件,我宁愿在堆上分配而不是在堆栈上分配。与CDF myCData[51];相反,您应该执行CDF *myCData = malloc(50 * sizeof(CDF));,这将为您提供动态分配,而不是静态。

数组大小

如果你注意到上面的话,我分配了50而不是51,这是因为你的for只穿过了前50个。除非我错过了什么,并原谅我,如果我确实,你'重新分配额外的sizeof(CDF),这当然不是必要的,是一种不安全感。

结构包装&amp;填充

根据您正在编译它的平台,并且还取决于编译器(行为是实现定义的),您的结构是不可移植的,并且在将来解释时肯定会给您带来麻烦,由于填充或包装不一致。填充基本上是填充结构中变量之间的间隙,以确保每个变量都在一个地址上,该地址是字长的一个因子。 这是默认启用的。另一方面打包 - 顺便说一下,缺少填充 - 不是。为确保工作按计划进行,您可以选择以下选项。

  1. 如果您要节省空间(无论出于何种原因)并且没有在RISC计算机上运行,​​请继续通过将__attribute__((__packed__))添加到GCC来启用GCC打包(这意味着禁用填充!) struct定义。请注意,虽然这样可以节省空间,但是它会大大减慢你的架构代码,例如允许它(像x86,amd64这样的CISC)*并且不会在不允许缺乏严格对齐的架构上运行。
  2. 如果您不想打包并保持代码更快,总是将数据类型按照其大小的递减顺序放入您的结构中。这将阻止任何内部填充,从而将填充减少到最小,这只是尾随填充
  3. * x86 CPU上的SSE2指令确实要求数据为128位(16字节)对齐,并且在这些体系结构上使用对齐数据可以带来显着的性能优势。