7

こんにちは、次の行を含むファイルがあります。

wwa weweweof ewewe wdw:

      1    11 ms    <1 ms    <1 ms  174.78.134.1  
      2    11 ms    <1 ms    <1 ms  174.78.134.1 
      3     5 ms    <1 ms    <1 ms  x58trxd00.abcd.edu.com [143.71.290.42] 
      4    11 ms    <1 ms    <1 ms  174.78.134.1 

私は使っている

    if(linecount == 8)
    while( fscanf(fp, "%d %s %s %s %s  %s %s",&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8) != EOF ){  
          printf("%s",ch);
        } 

    else if (linecount == 9){
       while( fscanf(fp, "%d %s %s %s %s  %s %s %s",&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9) != EOF ){  
          printf("%s",ch);
       }
    }

上記のelse-ifステートメントをそれに応じて実行できるように、ファイル内の行行に8つまたは9つの要素が含まれているかどうかを確認するにはどうすればよいですか?

4

4 に答える 4

15

fscanf を使用して行を読み取る

いいえ。

しかし、私はそれが良い考えだと思ったので...

いいえ。


fgets()行の読み取りは関数を使用して行われます (面白いマニュアルを読んでください):

char buf[LINE_MAX];
while (fgets(buf, sizeof buf, file) != NULL) {
    // process line here
}

次に、(推奨されません)またはand (推奨)sscanf()のような正気の関数を使用して解析できます。( docs )の戻り値がではなく、正常に読み取られたエンティティの数であることも注目に値します。したがって、文字列を解析するための怠惰なアプローチは次のようになります。strchr()strtok_r()scanf() EOF

if (sscanf(buf, "%s %s %s %s %s %s %s %s %s", s1, s2, ...) < 9) {
    // there weren't 9 items to convert, so try to read 8 of them only
}

%sまた、次のように、バッファ オーバーフロー エラーを回避するために、変換指定子で長さ制限を使用することをお勧めします。

char s1[100];
sscanf(buf, "%99s", s1);

同様に、&文字列をスキャンする (中に入れる) 場合は address-of 演算子を使用しないでください - char の配列はすでに に崩壊してchar *おり、それはまさに%s変換指定子が期待するものです - の型は&s1is char (*)[N]ifs1は Ncharの配列です - そしてタイプが一致しないと、 scanf()invoke が未定義の動作になります。

于 2013-08-07T08:43:17.920 に答える
0

配列の値が現在 に設定されているfgets()ため、この関数を使用する必要があります。swagnull

于 2013-08-07T09:39:50.040 に答える