使用fscanf在结构数组中设置结构的属性

时间:2011-02-25 20:38:53

标签: c arrays struct scanf

由于ScanF没有发生Seg Fault,这是由于我的主要功能出现问题。

我正在尝试读取一些数据文件,当我尝试使用fscanf时,我的程序是seg faulting。这就是我所拥有的:

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,structs和数组(无论如何,这看起来可能更清晰。

这是结构:

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

} rider; 

3 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:1)

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

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

请注意,riderNumber不使用“address-of”运算符(&),因为它是一个数组。

答案 2 :(得分:0)

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