[英]reading files: How file pointer is moved using fscanf and how scanf/fscanf work with missing %type
我真的是C語言中的文件處理新手,我想問幾個問題!
特別是,我不確定fscanf()和fgets()是否會自動逐行遞增文件指針。 根據我對測試和文檔的了解,fscanf()一次只能將文件指針移動1個字符/類型。 但是fgets()似乎逐行讀取文件(因為遇到換行符時它將終止)。 並且從文檔中,fscanf()將忽略任何空格字符。 這是否意味着即使我有一行一行的輸入文件,fscanf仍無法一行一行地讀取它? 即使我指定了確切的格式,換行符也不會保留?
特別是,如果一行包含10個非空白部分(單詞,整數,雙精度等),但是我只指定其中3個要讀入變量(使用%*或根本不放置任何內容),這些將是什么?閱讀功能嗎?
例如,我的輸入文件如下所示:
9 opls_182 9 DNP CT 9 0.140 12.0110
10 opls_182 10 DNP CT 10 0.140 12.0110
11 opls_145 11 DNP CA 11 -0.115 12.0110
12 opls_145 12 DNP CA 12 -0.115 12.0110
我只想閱讀opls_182和CT和9部分(第二,第五和第六列)。 使用fgets()和sscanf(),我會這樣寫:
fgets(fp,500,buffer);
sscanf(buffer, "%*s %s %*d %*s %s %d %*f %*f", variables);
or this:
sscanf(buffer, "%*s %s %*d %*s %s %d %*s", variables);
or this:
sscanf(buffer, "%*s %s %*d %*s %s %d", variables);
這三個功能會以相同的方式工作嗎? 因此,在第二個版本中,最后%* s將解析整個最后兩列,還是僅解析第二個最后一列? (%s似乎從非空格字符開始到非空格字符)。
如果我的說明符多於每行中的部分怎么辦? 會出現錯誤還是多余的變量保持為0 /空?
如果我使用fscanf(),則只有第一個版本可以正常工作,而第二個和第三個版本會弄亂讀數,因為fscanf()不會自動跳行,對嗎?
scanf函數中的所有格式說明符都將忽略空格字符。 但是,如果我想跳過第一部分([bond])並讀取最后一個整數,有什么方法可以執行類似%* some_format%d的操作(忽略直到找到整數)? %[^ format]可以工作嗎? 我嘗試了%[^%d]或%[^ d],它們要么會停在字符“ d”,然后給出“ [bon”。 我知道您可以用%[^]指定要排除的字符數,但是,如果數字在整個文件中都在變化,則無法使用此方法。
我發現C語言中的讀/寫功能非常強大,但是正確操作也很棘手。 非常感謝你們!
規則很簡單: fgets()
讀取整行,除非該行的長度超過了提供的緩沖區,在這種情況下,它會讀取盡可能多的內容。 另一方面, fscanf()
讀取您告訴的內容,跳過前面的空白。 例如,給定一行"1 2 3"
(不帶引號), fgets()
將讀取整行,而fscanf(fp, "%d %d", &i1, &i2)
將讀取兩個整數並將它們存儲到提供的地址,並保留未讀的" 3"
(注意包括空格)。
在第二個sscanf()
調用中,最后的%*s
僅解析第二到最后一列。 如果要跳過所有內容直到行尾,請使用%*[^\\n]
東西。 您是正確的,如果您使用fscanf
,則只有第一個版本fscanf()
您的要求,因為fscanf()
會將換行符視為另一個空格。 不過,您可以使用%*[^\\n]
格式說明符來修復fscanf()
版本。
scanf
無法“搜索”輸入,它必須始終根據指定的格式對其進行解析。 沒有等效於.*
正則表達式的格式。
您的scanf
調用將不會執行您想要的操作,因為%s
的第一個實例將吃掉其余的字符串,因此將僅處理兩個格式字符。 但是,如果將%s
替換為%[^0-9]
,它將完全滿足您的要求(對於此輸入)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.