2016-11-12 231 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に改行して格納していない1文字まで読み込み、および第二指定子は改行が、抑止を読み込み割り当て。このループの結果、改行をスキップしてファイル内のすべての文字を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()の代替アプローチが必要に応じて適しているようです。

関連する問題