3

これはばかげて単純ですが、私はそれで問題を抱えています。

テキストファイルにはヘッダーがあり、

例えば、

# Avizo BINARY-LITTLE-ENDIAN 2.1

define Lattice 496 384 470

Parameters {
    AlignTransform {
        slice0000 0 -0 -30 -1,
        slice0001 0 -0 -30 -1,
        slice0002 0 -0 -30 -1,

そして、fscanfを使用してこれらの各行を読み取ろうとしています。

   int i;
   for (  i = 0; i < 10; i++ ) {
     fscanf(fp, "%s\n", buf);  
     printf("%d) %s\n",i,buf);
   }

その結果、

0) #
1) Avizo
2) BINARY-LITTLE-ENDIAN
3) 2.1
4) define
5) Lattice
6) 496
7) 384
8) 470
9) Parameters

つまり、改行ではなく空白を解析します。何が起こっているのかわからない。

4

3 に答える 3

10

を使用することをお勧めしますが、使用fgetsを主張する場合はfscanf

fscanf(fd, "%[^\n]\n", buff);

これは完全な行を読み取ります。

于 2012-05-07T10:14:32.267 に答える
6

%s指定子はfscanf単語を読み取るため、スペースに到達すると停止します。

fgets行全体を読み取るために使用します。

于 2012-05-07T06:22:10.987 に答える
1

%sは「文字列」を意味する場合がありますが、fscanf(scanfとして)は貪欲なマッシングではありませんが、区切り文字は「改行」であると伝える必要があります。また、バッファオーバーフローを防ぐために、最大バッファサイズを設定することをお勧めします。

#include <stdio.h>

#define NAME_MAX    80
#define NAME_MAX_S "80"

int main(void)
{
    static char name[NAME_MAX + 1]; // + 1 because of null
    if(scanf("%" NAME_MAX_S "[^\n]", name) != 1)
    {
        fputs("io error or premature end of line\n", stderr);
        return 1;
    }

    printf("Hello %s. Nice to meet you.\n", name);
}
于 2012-05-07T06:43:09.867 に答える