2016-11-12 189 views
-3

我在使用fscanf()函數讀取多行文件。我希望忽略換行符,但不要忽略文件中可能存在的其他空白字符。我怎樣才能最好地做到這一點?使用fscanf忽略換行符()

+3

您需要先選擇一種語言。 C或C++。他們是不同的語言。 –

+1

你想要解析什麼格式? – chqrlie

+0

@SamVarshavchik我使用C,但是這不是在C++中的傳統功能?熟悉C++的人應該熟悉fscanf() – piper1935

回答

0

我認爲這確實你問:

char ch[2]; 
while (fscanf(fp, "%1[^\n]%*[\n]", ch) == 1) 
    putchar(ch[0]); 

第一格式說明中最多讀取一個字符不是字符串ch在一個換行符,並將其存儲,而第二符讀取換行,但抑制分配。此循環的結果是打印文件中的所有字符,跳過換行符,直到EOF

@AnT在評論中指出,對於以換行符開始的文本文件,該方法將失敗,並提出了修正:在抑制賦值的同時讀取換行符的循環之前調用fscanf()。改進後的代碼是:

char ch[2]; 
fscanf(fp, "%*[\n]"); 
while (fscanf(fp, "%1[^\n]%*[\n]", ch) == 1) 
    putchar(ch[0]); 
+0

這樣做的問題是,如果輸入以換行符開始,此'fscanf'將立即失敗並退出循環。 – AnT

+0

Hrmmmm。你是對的@AnT。 –

+0

但是你不能只是做'scanf(「%* [\ n]」);'在循環之前? – AnT

0

如果你只在忽略換行符興趣,使用getc()比使用fscanf()更簡單,更高效:

void copy_ignoring_newline(FILE *fin, FILE *fout) { 
    int c; 
    while ((c = getc(fin)) != EOF) { 
     if (c != '\n') 
      putc(c, fout); 
    } 
} 

可以適應這個給你想要的任何處理在文件內容上執行。

fscanf()是解析文件非常笨重的接口,它把空格,換行和其他空白字符相同,除了%c%[轉換說明。 getc(),fgets()fread()的替代方法似乎更適合您的需求。