фильтр fscanf () - PullRequest
       22

фильтр fscanf ()

0 голосов
/ 28 ноября 2011

У меня есть файл с данными в этом формате:

Имя WeekDay Месяц день, Год StartHour: StartMin Расстояние Hour: Min: Sec

Пример: John Mon 5 сентября 2011 г. 09:18 5830 0: 26: 37

Я хочу отсканировать это в структуру:

typedef struct {
    char name[20];
    char week_day[3];
    char month[10];
    int day;
    int year;
    int startHour; 
    int startMin;
    int distance;
    int hour;
    int min;
    int sec;
} List;

Я использую fscanf ():

List listarray[100];
for(int i = 0; ch = fgetc(file) != 'EOF'; ch = fgetc(file), i++){
    if(ch != '\0'){
        fscanf(file, "%s %s %s %d %d %d %d %d %d %d %d", &listarray[i].name...etc)
    }
}

Моя проблема в том, чтоЯ хочу отфильтровать шум во входной строке:

Месячный день *, * год <- запятая одинакова во всех записях.Я просто хочу месяц в массиве char, день в int. </p>

И отметки времени:

startHour: startmin и hour: min: sec <- здесь я хочу отфильтроватьдвоеточие. </p>

Нужно ли сначала поместить его в строку, а затем выполнить какое-то разбиение, или я могу обработать его в fscanf?

Обновление:

Хорошо, так яЯ пытался заставить это работать сейчас, но я просто не могу.Я буквально понятия не имею, в чем проблема.

#include <stdio.h>

/*
 Struct to hold data for each runners entry
 */
typedef struct {

    char name[21];
    char week_day[4];
    char month[11];
    int date,
    year,
    start_hour,
    start_min,
    distance,
    end_hour,
    end_min,
    end_sec;

} runnerData;

int main (int argc, const char * argv[])
{
    FILE *dataFile = fopen("/Users/dennisnielsen/Documents/Development/C/Afleveringer/Eksamen/Eksamen/runs.txt", "r");
    char ch;
    int i, lines = 0;

    //Load file
    if(!dataFile)
        printf("\nError: Could not open file!");

    //Load data into struct.
    ch = getc(dataFile);

    //Find the total ammount of lines
    //To find size of struct array
    while(ch != EOF){
        if(ch == '\n')
            lines++;

        ch = getc(dataFile);
    }

    //Allocate memory
    runnerData *list = malloc(sizeof(runnerData) * lines);

    //Load data into struct
    for(i = 0; i < lines; i++){

        fscanf(dataFile, "%s %s %s %d, %d %d:%d %d %d:%d:%d %[\n]",
               list[i].name,
               list[i].week_day,
               list[i].month,
               list[i].date,
               list[i].year,
               list[i].start_hour,
               list[i].start_min,
               list[i].distance,
               list[i].end_hour,
               list[i].end_min,
               list[i].end_sec);

        printf("\n#%d:%s", i, list[i].name);
    }  

    fclose(dataFile);


    return 0;
}

Мне сказали, что "только строки, которые не требуют и перед ними в fscanf ();"но я пробовал как с амперсандом, так и без него, но безрезультатно.

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Поместите «шум» в строку формата.

Также вы можете ограничить размер строк.

И избавиться от & для массивов.

И проверить возвращаемое значение из scanf!

// John Mon September 5, 2011 09:18 5830 0:26:37
if (scanf("%19s%2s%9s%d,%d%d:%d%d%d:%d:%d", ...) != 11) /* error */;
//             ^^^ error: not enough space

Обратите внимание: week_day имеет место для 2 символов и только нулевого терминатора.

0 голосов
/ 28 ноября 2011

Вы можете поместить этот noise в строку формата scanf.

Обратите внимание, что для строк даты / времени вы можете использовать strptime.Он выполняет ту же работу, что и scanf, но специализируется на дате / времени.Вы сможете использовать %Y, %M ... и другие с ним.

...