fscanf()过滤器

时间:2011-11-28 11:25:57

标签: c scanf

我有一个包含以下格式数据的文件:

名称WeekDay月份日,年份StartHour:StartMin Distance Hour:Min:Sec

实施例: John Mon September 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中的那一天。

时间戳:

startHour:startmin和hour:min:sec< - 这里我想过滤掉冒号。

我是否需要先将其放入字符串然后进行拆分,还是可以在fscanf中处理它?<​​/ p>

更新

好吧,我一直试图让它现在起作用,但我根本不能。我完全不知道问题是什么。

#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()中只有字符串不需要&amp;在他们面前;”但无论是否使用符号,我都尝试过无效。

2 个答案:

答案 0 :(得分:1)

将“noise”放在格式字符串中。

另外,您可能希望限制字符串的大小。

摆脱阵列的&

并测试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个字符的空间和零终结符。

答案 1 :(得分:0)

您可以将此 noise 置于scanf格式字符串中。

另请注意,对于日期/时间字符串,您可以使用strptime。它与scanf完成相同的工作,但专注于日期/时间。您可以使用%Y%M ...以及其他内容。