我试图编写一个将.bin文件读入动态分配的结构的程序。 似乎做我想做的事,直到我需要打印结果。我一遍又一遍地遇到了相同结构的无限循环,而不是每个结构只有一次。代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
main(){
//File pointer
FILE *binFile = NULL;
//Struct declaration
typedef struct flightData_struct {
char flightNum[7];
char origCode[5];
char destCode[5];
int timeStamp;
struct flightData_struct* next;
} flightData;
flightData myFlightData;
struct flightData_struct *head;
struct flightData_struct *tail;
//Opening file
printf("Opening file...\n");
binFile = fopen("acars.bin", "rb");
if (binFile == NULL){
printf("ERROR: Could not open file. Please try again.");
return -1;
}
//Malloc'ing first struct
struct myflightData *point = (struct myFlightData*) malloc(sizeof(flightData));
fread(point, sizeof(flightData), 1, binFile);
head = point;
tail = point;
//Malloc'ing structs
while (!feof(binFile)){
flightData *temp = (struct flightData*) malloc(sizeof(flightData));
fread(temp, sizeof(flightData), 1, binFile);
temp->next = NULL;
tail->next = temp;
tail = tail->next;
}
tail = head;
while (tail != 0){
int t;
t = tail->timeStamp;
time_t time = t;
printf("%s| %s| %s| %s\n\n", tail->flightNum, tail->origCode, tail->destCode, asctime(gmtime(&time)));
}
//Closing file
printf("Closing file...");
fclose(binFile);
return 0;
}
这是我从它得到的输出(似乎无限循环)。
答案 0 :(得分:1)
在while (tail != 0)
循环中,您永远不会更新tail
,因此循环条件永远不会改变。您需要在列表中移动tail
。将其添加到循环的末尾:
tail = tail->next;
这将允许您遍历列表。
编辑:
虽然这样做有效,但您失去了对列表尾部的引用,并且让其他人阅读您的代码时会感到困惑。您应该定义一个单独的变量,例如flightData temp
,将其初始化为head
,并在循环中使用它而不是tail
。
其他一些问题:
切勿在C中转换malloc
的返回值,因为这样做可能会掩盖其他问题,例如stdlib.h
未包含在内。由于malloc
返回void *
,因此可以将其分配给任何没有强制转换的指针类型。请注意,这与需要此类演员的C ++不同。
然后就是这样:
struct myflightData *point = malloc(sizeof(flightData));
没有定义struct myflightData
。你可能想要flightData
。
您还未能检查fread
的返回值。你应该做这样的事情:
len = fread(temp, sizeof(flightData), 1, binFile);
if (len == -1) {
perror("fread failed");
exit(1);
} else if (len != 1) {
fprintf(stderr,"read %d, expected %d\n", len, 1);
}