簡體   English   中英

fscanf()讀取帶有格式化行中空格的字符串

[英]fscanf() reading string with spaces in formatted lines

使用這種結構:

typedef struct sProduct{
  int code;
  char description[40];
  int price;
};

我想用這種格式讀取一個txt文件:

1,Vino Malbec,12

格式為: code,description,price 但是當它有空格時,我在閱讀描述時遇到了問題。

我試過這個:

fscanf(file,"%d,%[^\n],%d\n",&p.code,&p.description,&p.price);

代碼正在保存好,但在描述中正在保存Vino Malbec,12 ,當我只想保存Vino Malbec因為12是價格。

有幫助嗎? 謝謝!

主要問題是"%[^\\n]," "%[^\\n]"掃描除了'\\n'以外的所有內容,因此description掃描',' 代碼需要在遇到逗號時停止掃描到description

使用面向行的文件數據,第一次讀取1行。

char buf[100];
if (fgets(buf, sizeof buf, file) == NULL) Handle_EOForIOError();

然后掃描它。 使用%39[^,]不掃描','並將寬度限制為39個char

int cnt = sscanf(buf,"%d , %39[^,],%d", &p.code, p.description, &p.price);
if (cnt != 3) Handle_IllFormattedData();

另一個漂亮的技巧是:使用" %n"來記錄解析的結束。

int n = 0;
sscanf(buf,"%d , %39[^,],%d %n", &p.code, p.description, &p.price, &n);
if (n == 0 || buf[n]) Handle_IllFormattedData_or_ExtraData();

[編輯]

簡化:@ user3386109

更正: @ cool-guy刪除&

@chux已經就此發布了一個很好的答案,但是如果你需要使用fscanf ,請使用

if(fscanf(file,"%d,%39[^,],%d",&p.code,p.description,&p.price)!=3)
    Handle_Bad_Data();

這里, fscanf首先掃描一個數字( %d )並將其放入p.code 然后,它掃描逗號(並丟棄它),然后掃描最多39個字符或直到逗號並將所有內容放入p.description 然后,它掃描逗號(並丟棄它),然后掃描一個數字( %d )並將其放入p.price

暫無
暫無

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

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