Установка атрибутов структуры в массиве структур с помощью fscanf - PullRequest
0 голосов
/ 25 февраля 2011

Ошибка сегмента не произошла из-за ScanF, это было связано с проблемой с моей основной функцией.

Я пытаюсь прочитать некоторые файлы данных, и моя программаОшибка seg, когда я пытаюсь использовать fscanf.Вот что у меня есть:

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; 

Ответы [ 3 ]

2 голосов
/ 25 февраля 2011

Вы должны дать 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 голос
/ 25 февраля 2011

Я заметил, что вы не используете указатели в своем реальном коде, хотя у вас есть указатели в временном примере.

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

Обратите внимание, что riderNumber не использует "address-of"оператор (&), потому что это массив.

0 голосов
/ 25 февраля 2011

Это, безусловно, выполнимо, как вы описали в первую очередь. Было бы немного легче отлаживать, если у нас есть объявление и определение вашей структуры. Одна вещь, которую я замечаю, это то, что riderArray[numberOfRiders].arrivalTime представляется значением; в fscanf вам нужно, чтобы он был адресом значения.

...