簡體   English   中英

由於文件 txt 分隔符逗號 C 而導致 fscanf 出現問題

[英]Problem with fscanf because of file txt divider comma C

我必須使用這個文件信息
香煙,吸煙用,1,5.500000
伍茲,用於室內煙囪,2,100.000000

要填充此結構:

typedef struct product{
    char name[32];
    char about_product[32];
    int product_id;
    double price;
}sProduct;

使用這個 function:

void print_prod(){
    sProduct ptr;
    FILE *fp=fopen("product.txt", "r");
    int cnt=1;
    do{
        fscanf(fp, "%s,%s,%d,%g\n", ptr.name, ptr.about_product, &ptr.product_id, &ptr.price);
        cnt++;
    }while(!feof(fp));  
    fclose(fp);
}

但它沒有錯誤,因為我在 txt 文件中使用逗號作為分隔符。

這里有兩個問題,都圍繞scanf如何處理%s指令:

  • 它掃描以空格分隔的字符串,因此它將某些輸入數據中的內部空格作為分隔符
  • 它掃描以空格分隔的字符串,因此它不會將逗號識別為字段分隔符

有幾種方法可以 go 關於您設置的輸入任務,但要繼續使用scanf將您的特定輸入直接掃描到數據結構中,您需要%[指令而不是%s

%[指令接受一個“掃描集”,准確描述字段中可能出現的字符,其中可以包括空格。 這采用類似於正則表達式或全局字符 class 的形式。 對應的參數應該是指向char的指針,就像%s指令一樣。 您還應該知道,與大多數指令(包括%s )不同, %[指令不會跳過前導空格。 對您來說,它的使用可能如下所示:

        fscanf(fp, "%[^,],%[^,],%d,%g\n", ptr.name, ptr.about_product, &ptr.product_id, &ptr.price);

那里的兩個%[^,]字段描述符分別掃描除逗號 ( , ) 以外的任意數量的字符。

此外,明智的做法是指定字段寬度,以避免在數據中出現過長字段時超出數組的邊界。 由於您提供了 32 字節的 arrays,並且每個字節必須為字符串終止符保留一個字節,因此可能是這樣的:

        fscanf(fp, "%31[^,],%31[^,],%d,%g\n", ptr.name, ptr.about_product, &ptr.product_id, &ptr.price);

而且,與幾乎所有具有任何故障模式的功能一樣,您還應該以編程方式檢查function 是否成功。 您需要主動且始終如一地執行此操作,否則您的程序可能會以微妙而令人驚訝的方式失敗。 對於scanf和許多類似的使用,這意味着檢查返回值是否等於格式中輸入指令的數量(返回值表示成功掃描和分配了多少字段):

        int fields;
        fields = fscanf(fp, "%31[^,],%31[^,],%d,%g\n", ptr.name, ptr.about_product,
                &ptr.product_id, &ptr.price);
        if (fields != 4) {
            // handle input error ...
        }

附錄:

繼續您應該檢查具有故障模式的函數中的故障,我還觀察到另一個這樣的 function 是fopen() 這個 function 完全有可能失敗,在這種情況下,它會返回一個 null 指針。 一個健壯的程序肯定會檢查這種情況並優雅地處理它,使用類似於我為scanf()描述的模式。 但是,這與您詢問的具體不當行為無關。 (歸功於@RobertSsupportsMonicaCellio。)

暫無
暫無

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

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