2017-02-15 16 views
1

Я пытаюсь получить некоторые идеи, как проверить ошибки или ошибки в моем файле данных. Ошибки сделаны мной, намеренно.C - Проверка ошибок в файле

Мой файл выглядит следующим образом

Имя HouseNr Город Страна номер (сколько видов спорта) Sport1 SPORT2 SportN

Carl Lincoln42 Houston США 2 Баскетбол Футбол

while(fscanf(fData, "%s %s %s %s %d", (person + i)->name, 
    (person + i)->adr.houseNr, (person + i)->adr.city, (huvi + i)->adr.country, 
    &(sport + i)->sportCount) == 5) 
{ 
    for (j = 0; j < (person + i)->sportCount; j++) 
    { 
     fscanf(fData, "%s", (person + i)->sportName[j]); 
    } 
    i++; 
} 

Теперь я не понимаю, как следует Я проверяю ошибки в этом файле.

Предположим, что значение number больше, чем значение SportN.

Это будет означать, что он сканирует детали другого человека, как SportName

Как я должен решить это? Измените код (пожалуйста, некоторые предложения) или измените способ хранения моих данных?

+0

Ваши условия должны заботиться о количестве и новой строки, например, – LPs

+0

ошибками я имею в виду, если я типа 5 Количество, но у меня есть только 2 SportNames. – Karl

+3

Являются ли данные в файле * на основе строки *? Тогда хороший старт - это чтение строки за строкой и разбор каждой строки отдельно. –

ответ

2

Как @SomeProgrammerDudementioned in the comments, гораздо лучше прочитать файл по строкам и проанализировать каждую строку соответственно.

Вы можете использовать спецификатор формата %[ для чтения строк из файла. Это может быть достигнуто с помощью %[^\n], который сообщает *scanf для сканирования всего до \n (или EOF, в зависимости от того, что наступит раньше). Конечно, это не сканирования в \n и, как %[^\n] будет неудаче, если первый символ для чтения является \n, вы должны избавиться от перевода строки после каждой строки. Этого можно достичь, используя %*c сразу после %[^\n]. Он сообщает *scanf, чтобы прочитать и выбросить символ.

Теперь, когда вы прочитали строку, пришло время ее разобрать. Для этого может использоваться функция sscanf вместе с помощью спецификатора формата %n.

char line[1000]; 
int i = 0; 
while(fscanf(fData, "%[^\n]%*c", line) == 1) 
{ 
    int offset; 
    if(sscanf(line, "%s %s %s %s %d%n", (person + i)->name, 
    (person + i)->adr.houseNr, (person + i)->adr.city, (huvi + i)->adr.country, 
    &(sport + i)->sportCount, &offset) != 5) 
    { 
     fprintf(stderr, "Invalid line '%s'\n", line); 
     i++; 
     continue; /* Move on to next line */ 
    } 
    bool valid = true; 
    for(int j = 0; j < (sport + i)->sportCount; j++) 
     if(sscanf(line + offset, "%s%n", (person + i)->sportName[j], &offset) != 1) 
     { 
      valid = false; 
      break; 
     } 
    char dummy[100]; 
    if(sscanf(line + offset, "%s", dummy) == 1) 
     valid = false; 

    if(valid) 
     printf("Good input for line '%s'\n", line); 
    else 
     fprintf(stderr, "Invalid number of items in '%s'\n", line); 
    i++; 
} 

Непроверено Код ↑

+0

Это потрясающе, спасибо! Теперь я знаю, как использовать силу sscanf. – Karl