2016-06-17 3 views
0

У меня есть некоторая проблема в fscanf функция. Я новичок в C, и я хотел сделать строки чтения из файла и сохранить их в структуре, но, похоже, я не очень хорошо это понимаю ^^.fscanf wont work - Программа выдает ошибку

PATIENT *patientTab; 
int tabSize = 0; 
int patientCount = 0; 
PATIENT temp; 
int tempIndex = 0; 

if (openFile()){ 
    printf("Plik otworzony!\n\n"); 
    while(fscanf(dataBase, "%s %f", 
    &temp.patientNumber, 
    &temp.patientGender, 
    &temp.patientLength, 
    &temp.patientWeigth, 
    &temp.patientHeadCircuit, 
    &temp.patientApperance, 
    &temp.patientPulse, 
    &temp.patientGrimace, 
    &temp.patientActivity, 
    &temp.patientRespiration) 
     != EOF){ 

      if (patientCount + 1 >= tabSize){ 
       tabSize += 5; 
       patientTab = realloc(patientTab, sizeof(int) * tabSize); 
      } 

       for (tempIndex; tempIndex < 5; tempIndex++){ 

        patientTab[patientCount].patientNumber[tempIndex] = temp.patientNumber[tempIndex]; 

       } 

      patientTab[patientCount].patientGender = temp.patientGender; 
      patientTab[patientCount].patientLength = temp.patientLength; 
      patientTab[patientCount].patientWeigth = temp.patientLength; 
      patientTab[patientCount].patientHeadCircuit = temp.patientHeadCircuit; 
      patientTab[patientCount].patientApperance = temp.patientApperance; 
      patientTab[patientCount].patientPulse = temp.patientPulse; 
      patientTab[patientCount].patientGrimace = temp.patientGrimace; 
      patientTab[patientCount].patientActivity = temp.patientActivity; 
      patientTab[patientCount].patientRespiration = temp.patientRespiration; 
      patientCount++; 

     } 

    //free(temp); 
    fclose(dataBase); 
} 
else endProgram(); 

dataBase является глобальным.

Проблема заключается в том, что программа пытается зациклиться на «while», которая включает функцию «fscanf», программа выдает ошибку, и единственное, что я могу сделать, это закрыть программу. Я нашел пример в Интернете, но это был простой пример с одной переменной. Я уверен, что проблема заключается в моей декларации со многими параметрами с « temp».

Структура:

typedef struct Patient { 

char patientNumber[5]; 
char patientGender; 
double patientLength; 
float patientWeigth; 
float patientHeadCircuit; 
int patientApperance; 
int patientPulse; 
int patientGrimace; 
int patientActivity; 
int patientRespiration; 

}PATIENT; 

... и это фрагмент содержимого файла: txt link

+2

Что это безобразие? строка формата 'scanf' предназначена только для двух параметров. И вы проходите как миллион из них. –

+0

Значения всех остальных элементов структуры будут неопределенными, поскольку struct 'temp' не была инициализирована. UB. –

+1

Я не понимаю, что вы имеете в виду, используя только ** два тега формата формата для чтения в ** 10 ** переменных: 'while (fscanf (dataBase,"% s% f ", & temp.patientNumber, & temp. patientGender, & temp.patientLength, & temp.patientWeigth, & temp.patientHeadCircuit, & temp.patientApperance, & temp.patientPulse, & temp.patientGrimace, & temp.patientActivity, & temp.patientRespiration) '? – user3078414

ответ

0

Я понимаю, что вы имеете в виду содержание в ссылке http://www.beetxt.com/BMB/

Пожалуйста изменение 1)

while(fscanf(dataBase, "%s %f", 
    &temp.patientNumber, 
    &temp.patientGender, 
    &temp.patientLength, 
    &temp.patientWeigth, 
    &temp.patientHeadCircuit, 
    &temp.patientApperance, 
    &temp.patientPulse, 
    &temp.patientGrimace, 
    &temp.patientActivity, 
    &temp.patientRespiration) 

с

while(fscanf(dataBase, "%s %c %lf %f %f %d %d %d %d %d", 
    temp.patientNumber, 
    &temp.patientGender, 
    &temp.patientLength, 
    &temp.patientWeigth, 
    &temp.patientHeadCircuit, 
    &temp.patientApperance, 
    &temp.patientPulse, 
    &temp.patientGrimace, 
    &temp.patientActivity, 
    &temp.patientRespiration) 

2)

if (patientCount + 1 >= tabSize){ 
       tabSize += 5; 
       patientTab = realloc(patientTab, sizeof(int) * tabSize); 
      } 

С

if (patientCount + 1 >= tabSize){ 
       tabSize += 5; 
       patientTab = realloc(patientTab, sizeof(PATIENT) * tabSize); 
      } 

3)

for (tempIndex; tempIndex < 5; tempIndex++){ 

        patientTab[patientCount].patientNumber[tempIndex] = temp.patientNumber[tempIndex]; 

       } 

      patientTab[patientCount].patientGender = temp.patientGender; 
      patientTab[patientCount].patientLength = temp.patientLength; 
      patientTab[patientCount].patientWeigth = temp.patientLength; 
      patientTab[patientCount].patientHeadCircuit = temp.patientHeadCircuit; 
      patientTab[patientCount].patientApperance = temp.patientApperance; 
      patientTab[patientCount].patientPulse = temp.patientPulse; 
      patientTab[patientCount].patientGrimace = temp.patientGrimace; 
      patientTab[patientCount].patientActivity = temp.patientActivity; 
      patientTab[patientCount].patientRespiration = temp.patientRespiration; 
      patientCount++; 

с

for (tempIndex; tempIndex < 5; tempIndex++){ 
    strcpy(patientTab[patientCount].patientNumber[tempIndex] = temp.patientNumber[tempIndex]); 
    patientTab[patientCount].patientGender = temp.patientGender; 
    patientTab[patientCount].patientLength = temp.patientLength; 
    patientTab[patientCount].patientWeigth = temp.patientLength; 
    patientTab[patientCount].patientHeadCircuit = temp.patientHeadCircuit; 
    patientTab[patientCount].patientApperance = temp.patientApperance; 
    patientTab[patientCount].patientPulse = temp.patientPulse; 
    patientTab[patientCount].patientGrimace = temp.patientGrimace; 
    patientTab[patientCount].patientActivity = temp.patientActivity; 
    patientTab[patientCount].patientRespiration = temp.patientRespiration; 
    patientCount++; 

} 

Надеется, что это работает отлично .. И изменить char patientNumber[5]; к char patientNumber[6];

+0

Ну, я не думал об удалении ' 'перед терпеливым числом в цикле while и patientTab требуется malloc, но теперь все работает. Спасибо :) – Blichu

+0

Он также работает с realloc .. Просто измените первую строку 'PATIENT * patientTab;' на 'PATIENT * patientTab = NULL;' –

+0

realloc все еще существует, я просто поместил строку типа "patientTab = malloc (5 * SizeOf (ПАЦИЕНТ));» перед циклом while, потому что фрагмент с realloc вызвал ошибку ... но, я думаю, что добавление «null» тоже хорошо: D – Blichu