Чтение нескольких строк с помощью fscanf в C

У меня в файле есть такая строчка: "33 вс 15:00 FCM - SIF 3 - 0". Мне нужно извлечь все данные. У меня есть этот код до сих пор, который делает небольшую ошибку при извлечении строк «sun», «FCM» и «SIF». Это превращает «sun» в «sunFCMSIM», «FCM» в «FCMSIF», тогда как «SIF» является правильным.

Вы можете просто сделать входной файл из нескольких строк, как показано выше. Итак, как мне убедиться, что эта информация извлечена правильно?

#include <stdio.h>
#include <stdlib.h>

#define LINEBUFFERSIZE 50
#define TEAMNAMELENGTH 3
#define WEEKDAYLENGTH 3

void __construct(char fileName[FILENAME_MAX]) {
FILE *inputFile;
char buffer[LINEBUFFERSIZE];
// Open input file
inputFile = fopen(fileName, "r");

// Read all matches and create
while(fgets(buffer, LINEBUFFERSIZE, inputFile) != NULL){
    int round, hour, minute, homeGoals, outGoals;
    char outTeam[TEAMNAMELENGTH], homeTeam[TEAMNAMELENGTH], weekday[WEEKDAYLENGTH];

    fscanf(inputFile, "%d %3s %2d:%2d %3s - %3s", &round, weekday, &hour, &minute, homeTeam, outTeam);
    printf("Round: %d\n", round);
    printf("%s %02d:%02d\n", weekday, hour, minute);
    //printf("%s - %s\n", homeTeam, outTeam);
}

fclose(inputFile);
}

int main() {
    /*char inputFile[FILENAME_MAX];
    printf("Enter input file> "); scanf("%s", &inputFile);*/
    __construct("superliga-2009-2010");
    return 0;
}

person Thomas Stig Jacobsen    schedule 09.12.2010    source источник


Ответы (1)


Согласно документации для fscanf, спецификатор преобразования s:

Соответствует последовательности непробельных символов; следующий указатель должен быть указателем на массив символов, длина которого достаточна для хранения входной последовательности и завершающего нулевого символа ('\0'), который добавляется автоматически.

Ваши буферы недостаточно велики, чтобы вместить терминатор NULL. Если вы исправите это, например, объявив outTeam, homeTeam и weekday следующим образом:

char outTeam[TEAMNAMELENGTH + 1], homeTeam[TEAMNAMELENGTH + 1], weekday[WEEKDAYLENGTH + 1];

Ваш код работает так, как ожидалось.

person Eric Melski    schedule 09.12.2010
comment
Благослови вас Бог :) Черт, я пропустил это :) Спасибо, приятель - person Thomas Stig Jacobsen; 09.12.2010