簡體   English   中英

fscanf格式說明符轉換為結構

[英]fscanf format specifier into structs

我的數據格式如下:

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);

即使這在調試器中中斷,也無法找出原因。

謝謝。

使用前必須初始化fullDate 最簡單的方法是:

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

或者甚至可以將其聲明為數組,以避免額外的初始化:

struct date{

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

    // ...
};

當然,您必須以某種方式確保讀取的字符串適合緩沖區。

您無法使用fscanf(der, "%s", r[i].fullDate);解析日期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);
}

您說您相信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個項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM