我无法将文件.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所说的:它编译,但是,我需要打印出数组以检查数据是否已加载..我们将看到嘿嘿!
答案 0 :(得分:0)
在我看来,您的代码存在以下问题。
对于看起来像一个相当大的文件,我宁愿在堆上分配而不是在堆栈上分配。与CDF myCData[51];
相反,您应该执行CDF *myCData = malloc(50 * sizeof(CDF));
,这将为您提供动态分配,而不是静态。
如果你注意到上面的话,我分配了50而不是51,这是因为你的for
只穿过了前50个。除非我错过了什么,并原谅我,如果我确实,你'重新分配额外的sizeof(CDF)
,这当然不是必要的,是一种不安全感。
根据您正在编译它的平台,并且还取决于编译器(行为是实现定义的),您的结构是不可移植的,并且在将来解释时肯定会给您带来麻烦,由于填充或包装不一致。填充基本上是填充结构中变量之间的间隙,以确保每个变量都在一个地址上,该地址是字长的一个因子。 这是默认启用的。另一方面打包 - 顺便说一下,缺少填充 - 不是。为确保工作按计划进行,您可以选择以下选项。
__attribute__((__packed__))
添加到GCC来启用GCC打包(这意味着禁用填充!) struct
定义。请注意,虽然这样可以节省空间,但是它会大大减慢你的架构代码,例如允许它(像x86,amd64这样的CISC)*并且不会在不允许缺乏严格对齐的架构上运行。* x86 CPU上的SSE2指令确实要求数据为128位(16字节)对齐,并且在这些体系结构上使用对齐数据可以带来显着的性能优势。