我正在尝试从文件中读取文件,其内容的格式如下:
0010:0020:0030:0400:stringUpTo50Chars
我用fopen()打开了文件,我想将文件的内容复制到一个名为records的数组中,该数组的结构具有以下格式:
struct structure{
int first;
int second;
int third;
int fourth;
char fifth;
};
数组声明为:
struct packet *records;
我一直在尝试使用fgets()以及strtok()和atoi()从文件中读取并将数据(以冒号分隔)放入记录数组中,但无法使其正常工作。见下文。
while(i<100)
{
fgets(data, 66, fp);
records[i].first= atoi(strtok(data, ":"));
records[i].second= atoi(strtok(NULL, ":"));
...
records[i].fifth= strtok(NULL, ":");
i++;
}
大多数代码行都按预期工作并存储正确的值。但是,如果有人能够解释为什么会出现以下任何问题,我们将不胜感激。
A)我的数据源中的两行被错误地读取并返回看似是表示存储器位置的整数而不是a =&lt;四位数值,例如840970506而不是12或0012.这只发生在六个值上,每两行有三个。
B)records.fifth中的所有数据似乎被最近的第五个值覆盖,即记录[1] .fifth应该是string1记录[2] .fifth应该是string2但是记录中的所有值[i] ] .fifth是string100。打印这个也会导致几行后崩溃。
C)放fclose(fp);通常会导致我的程序崩溃,偶尔它会超过它,但大多数情况下它没有。我之前用以下文件打开了文件:
FILE *fp;
fp = fopen(&sourceFile,"r");
&amp; sourceFile是一个用户设置文件名,包含要读取的数据:
const char sourceFile;
scanf("%s", &sourceFile);
删除“&amp;”导致崩溃。 D)免费(记录);释放为记录分配的内存空间会导致崩溃。
E)返回0;在任务结束时main()也会导致崩溃。
对于C,D和E,注释掉这些代码往往会让代码完成,但它仍会偶尔崩溃。 CodeBlocks 13.12没有给我任何构建消息,我不知道该怎么做。对我的任何/所有问题的任何帮助将不胜感激。
答案 0 :(得分:1)
首先:
您是否使用
为数据分配内存?records=malloc(100 * sizeof *records); // place for 100 data sets
接下来,您可以使用默认值手动设置所有结构元素,以查看该值是来自文件io还是内存中的值。
for ( int x=0; x<100; x++) { records[x].first=0; ... }
你的观点D) 您是否尝试释放数组中的单个元素,如
free( &records[7] );
如果是这样,那就错了!你只能释放你用malloc分配的内存。如上所述,您可以使用一个malloc分配内存。如果是这样,你必须在一个免费通话中释放所有这些!
我认为您错误地分配了内存,导致在访问此未分配的内存时出现大量崩溃。所以请再展示一下你的代码吧!
作为提示:请简单地使用调试器,您可以在其中看到您的编程文件和平文件。如果你在与编译器不同的方向上考虑你的编程,通常不容易找到错误: - )
你的一个结构元素只能包含一个char:
char fifth;
您无法在那里存储字符串。如果您想存储多达50个字符,请使用:
char fifth[50+1]; // +1 for the '\0' at the end of the string
也是行
fopen(&sourceFile,"r");
看起来有点疯狂。什么是sourceFile
?如果是:
const char *sourceFile="file.xyz";
你必须使用:
fopen(sourceFile,"r");