[英]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.