fscanf格式说明符到结构

时间:2016-07-30 18:58:25

标签: c struct scanf stdio format-specifiers

我有以下数据格式:

22/March/2014
137 8
15 16 34 8 18
17/November/2014
106 8
22 29 30 9 6
20/November/2014
169 10
50 58 38 29 1

我正在尝试使用fscanf来获取文件的内容并将它们放入以下结构中:

    struct date{

    //This is storing the date dd/month/yyyy.
    char* fullDate;

    // Number of foot and wheelchair passengers.
    int foot;
    int wheelchair;

    //number of infant, child, adult, senior and family tickets sold
    int infant;
    int child;
    int adult;
    int senior;
    int family;
};

所以我尝试了以下内容:

struct date r[50];
    FILE* der = fopen("C:\\Users\\Def\\Downloads\\annual_sales_data_2014.txt","r");
    int i = 0;
    rewind(der);
    fscanf(der, "%s", r[i].fullDate);
    fscanf(der, "%d %d ", &r[i].foot, &r[i].wheelchair);
    fscanf(der, "%d %d %d %d",&r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);
    printf("%s\n%d %d\n%d %d %d %d %d\n\n", r[i].fullDate, r[i].foot, r[i].wheelchair, r[i].infant, r[i].child, r[i].adult, r[i].senior, r[i].family);

    fclose(der);

但我相信fscanf没有被正确使用,而且我对格式说明符的文档感到有点困惑,我也是这样尝试的。

    fscanf(der, "%s/%s/%s\n%d %d\n%d %d %d %d %d\n", r[i].day, r[i].month, , r[i].year, &r[i].foot, &r[i].wheelchair, &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);

在上面的示例中,我还提供了结构,以接受日期月份和年份的3个char *。在格式说明符字符串的开头。这也没有用,所以我把它分解成一个较小的格式,看看我是否可以诊断问题。

即使在这个细分的例子中

fscanf(der, "%s", r[i].fullDate);

即使这在调试器中中断也无法解决原因。

感谢。

3 个答案:

答案 0 :(得分:1)

在使用之前必须初始化

fullDate。最简单的方法是:

r[i].fullDate = malloc(whatever_size_you_need);

或者您甚至可以将其声明为数组以避免额外的初始化:

struct date{

    //This is storing the date dd/month/yyyy.
    char fullDate[proper_size];

    // ...
};

当然,你必须确保读取字符串适合缓冲区。

答案 1 :(得分:1)

您无法使用fscanf(der, "%s", r[i].fullDate);解析日期,因为fulldate是未初始化的指针。您应该传递%s格式的数组地址。在结构中放置一个数组而不是指针,例如char fullDate[30];并使用fscanf(der, "%29s", r[i].fullDate);

请注意,您可以使用以下命令直接解析日期组件:

char monthName[16];
int day, year;

if (fscanf("%d/%15[^ /]/%d", &day, monthName, &year) == 3) {
    /* Date parsed correctly */
} else {
    /* At least one field missing, bail out */
    exit(1);
}

答案 2 :(得分:0)

你说你相信fscanf没有被正确使用,这是事实。这一行

fscanf(der, "%d %d %d %d", &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);

正在为要填充的5个字段传递参数,但它只有4个格式格式说明符。试试这个:

fscanf(der, "%d %d %d %d %d", &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);

此外,您应该始终检查数据字段是否已正确读取。来自fscanf的返回值会告诉您只读了4个项目。