[英]Can fscanf() read whitespace?
我已經有了一些使用fscanf()
讀取文本文件的代碼,現在我需要對其進行修改,以便之前沒有空格的字段需要允許空白。 文本文件基本上是以下形式:
標題:數據
標題:數據
等等...
這基本上是用fgets(inputLine, 512, inputFile); sscanf(inputLine, "%*s %s", &data);
解析的fgets(inputLine, 512, inputFile); sscanf(inputLine, "%*s %s", &data);
fgets(inputLine, 512, inputFile); sscanf(inputLine, "%*s %s", &data);
,讀取DATA字段並忽略標題,但現在一些數據字段需要允許空格。 我仍然需要在它之后立即忽略標題和空格,然后讀取包括空格在內的其余行。
無論如何使用sscanf()
函數執行此操作?
如果沒有,我可以對代碼進行哪些最小的改變來正確處理空白?
更新:我編輯了用fgets()+ sscanf()替換fscanf()的問題,這是我的代碼實際使用的。 當我第一次寫這個問題時,我並不認為它是相關的,這就是我將它簡化為fscanf()的原因。
如果你不能使用fgets()
使用%[
轉換說明符(帶有“exclude option”):
char buf[100];
fscanf(stdin, "%*s %99[^\n]", buf);
printf("value read: [%s]\n", buf);
但fgets()
更好。
編輯:版本與fgets()
+ sscanf()
char buf[100], title[100];
fgets(buf, sizeof buf, stdin); /* expect string like "title: TITLE WITH SPACES" */
sscanf(buf, "%*s %99[^\n]", title);
我強烈建議你停止使用fscanf()
並開始使用fgets()
(讀取整行),然后解析已讀取的行。
這將使您在解析非精確格式的輸入方面具有更大的自由度。
最簡單的事情是發出一個
fscanf("%*s");
丟棄第一部分然后只需調用fgets:
fgets(str, stringSize, filePtr);
如果您堅持使用scanf
,並假設您希望換行符作為終止符,則可以執行以下操作:
scanf("%*s %[^\n]", str);
但請注意,完全按照書面形式使用的上述內容是一個壞主意,因為沒有什么可以防止str
溢出(因為scanf
不知道它的大小)。 當然,您可以設置預定義的最大大小,並指定該大小,但是您的程序可能無法在某些有效輸入上正常工作。
如果輸入格式定義的行的大小不受限制,那么您唯一可行的選擇是使用fgetc
按char讀取數據char,定期重新分配緩沖區。 如果你這樣做,那么修改它以刪除所有讀取字符,直到第一個空格是相當微不足道的。
fscanf中的%s
說明符會跳過輸入上的任何空格,然后讀取一串非空白字符,最多不包括下一個空白字符。
如果要讀取換行符,可以使用%[^\\n]
作為說明符。 另外,格式字符串中的''將跳過輸入上的空格。 所以,如果你使用
fscanf("%*s %[^\n]", &str);
它將讀取第一個空白行的第一個東西(在你的情況下為“title:”),扔掉它,然后將讀取空白字符並將它們扔掉,然后讀取所有字符到新行到str ,這聽起來像你想要的。
小心str不會溢出 - 你可能想要使用
fscanf("%*s %100[^\n]", &str)
限制你將讀取的最大字符串長度(100個字符,不包括終止NUL)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.