簡體   English   中英

讀取文件:如何使用fscanf移動文件指針,以及scanf / fscanf如何在缺少%type的情況下工作

[英]reading files: How file pointer is moved using fscanf and how scanf/fscanf work with missing %type

我真的是C語言中的文件處理新手,我想問幾個問題!

  1. 我經常使用fscanf / fget將文件轉換為不同格式。 但是我對fscanf和fgets之間的區別不是很清楚。

特別是,我不確定fscanf()和fgets()是否會自動逐行遞增文件指針。 根據我對測試和文檔的了解,fscanf()一次只能將文件指針移動1個字符/類型。 但是fgets()似乎逐行讀取文件(因為遇到換行符時它將終止)。 並且從文檔中,fscanf()將忽略任何空格字符。 這是否意味着即使我有一行一行的輸入文件,fscanf仍無法一行一行地讀取它? 即使我指定了確切的格式,換行符也不會保留?

  1. 對於所有fscanf / scanf()/ sscanf(),我不確定如何解析字符串。

特別是,如果一行包含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()不會自動跳行,對嗎?

  1. 該問題與模式行有關:[債券] 387

scanf函數中的所有格式說明符都將忽略空格字符。 但是,如果我想跳過第一部分([bond])並讀取最后一個整數,有什么方法可以執行類似%* some_format%d的操作(忽略直到找到整數)? %[^ format]可以工作嗎? 我嘗試了%[^%d]或%[^ d],它們要么會停在字符“ d”,然后給出“ [bon”。 我知道您可以用%[^]指定要排除的字符數,但是,如果數字在整個文件中都在變化,則無法使用此方法。

  1. 如果所有部件之間沒有空格連接在一起,scanf能否區分不同的格式。 例如:9opls_182DNPCT91.40STUI8。 模式%d%s%d%s%f%s%d是否可以讀出:9,opls_,182,DNPCT,91.40,STUI,8?

我發現C語言中的讀/寫功能非常強大,但是正確操作也很棘手。 非常感謝你們!

  1. 規則很簡單: fgets()讀取整行,除非該行的長度超過了提供的緩沖區,在這種情況下,它會讀取盡可能多的內容。 另一方面, fscanf()讀取您告訴的內容,跳過前面的空白。 例如,給定一行"1 2 3" (不帶引號), fgets()將讀取整行,而fscanf(fp, "%d %d", &i1, &i2)將讀取兩個整數並將它們存儲到提供的地址,並保留未讀的" 3" (注意包括空格)。

  2. 在第二個sscanf()調用中,最后的%*s僅解析第二到最后一列。 如果要跳過所有內容直到行尾,請使用%*[^\\n]東西。 您是正確的,如果您使用fscanf ,則只有第一個版本fscanf()您的要求,因為fscanf()會將換行符視為另一個空格。 不過,您可以使用%*[^\\n]格式說明符來修復fscanf()版本。

  3. scanf無法“搜索”輸入,它必須始終根據指定的格式對其進行解析。 沒有等效於.*正則表達式的格式。

  4. 您的scanf調用將不會執行您想要的操作,因為%s的第一個實例將吃掉其余的字符串,因此將僅處理兩個格式字符。 但是,如果將%s替換為%[^0-9] ,它將完全滿足您的要求(對於此輸入)。

暫無
暫無

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

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