2011-02-25 67 views
0

由于ScanF,Seg Fault没有发生,这是由于我的Main函数有问题。使用fscanf在结构数组中设置结构的属性

我试图读取一些数据文件,并且当我尝试使用fscanf时,我的程序是seg fault。下面是我有:

while(fscanf(fr, "%d%s%d%d", riderArray[numberOfRiders].arrivalTime, riderArray[numberOfRiders].riderNumber, riderArray[numberOfRiders].floorArrival, riderArray[numberOfRiders].floorDestination)!= EOF) 
    { 
    numberOfRiders++; 
    } 

的预期目标是,每行(这是保证格式int string int int的)被解析成一个结构,直到file fr所有数据被读取。

这是可行吗?

我想替代,简直是:

while(fscanf(fr, "%d%s%d%d", &temp1, &tempS, &temp2, &temp3)!= EOF) 
    { 
     riderArray[numberOfRiders].riderNumber = temp1; 
     etc. etc. 
    numberOfRiders++; 
    } 

使用的临时变量,以避免必须的fscanf,结构和阵列完全(这很可能是清洁一下,反正结合

这里的结构:

typedef struct rider 
{ 
    char riderNumber[5]; 
    int timeWaiting; 
    int jobLength; 
    int arrivalTime; 
    int floorArrival; 
    int floorDestination; 

} rider; 
+0

您能否提供结构的定义? – 2011-02-25 20:42:33

+0

@布拉格 - 这是一个很好的观点。完成。 – 2011-02-25 20:54:45

+2

第一项应该是'char riderNumber [5]'(假设你不需要指针数组)。 – chrisaycock 2011-02-25 21:02:45

回答

2

你必须给的fscanf一些指针:

while(
    fscanf(fr, "%d%s%d%d", 
     &riderArray[numberOfRiders].arrivalTime, 
     riderArray[numberOfRiders].riderNumber, // this is already a pointer 
     &riderArray[numberOfRiders].floorArrival, 
     &riderArray[numberOfRiders].floorDestination 
    ) != EOF 
) 
+0

-1:你不知道结构成员是否被定义为指针或不是,括号是不必要的 – 2011-02-25 20:46:44

+2

@Blagovest Buyukliev:true,但通常当fscanf-like函数出现故障时,参数出现问题。至少,这是我检查的第一件事。和括号是为了可读性,我喜欢他们:) – BlackBear 2011-02-25 20:49:08

1

我注意到你没有在你的真实代码中使用指针,即使你的临时示例中有指针。

fscanf(fr, "%d%s%d%d", &riderArray[numberOfRiders].arrivalTime, riderArray[numberOfRiders].riderNumber, &riderArray[numberOfRiders].floorArrival, &riderArray[numberOfRiders].floorDestination) 

注意,因为它是一个数组riderNumber不使用“地址的”运算符(&)。

0

你首先描述的方式当然是可行的。如果我们有你的结构的声明和定义,那将更容易调试。我注意到的一件事是riderArray[numberOfRiders].arrivalTime似乎是一个值;在fscanf您需要它是地址的值。