2

ファイルから整数を 1 つずつ読み取り、それを行と列の番号としてプログラムに読み込もうとしています。

私のファイルの内容は次のとおりです。

3
2 1
2 2
2 3

そして私のコード:

fgets(line, 2, fp);
livecells = atoi(line);
fprintf(stderr, "\n%i live cells\n", livecells);    

while ( !feof(fp) ) 
{
  fgets(line, 5, fp);

  alive_row = atoi(&line[0]);
  alive_column = atoi(&line[2]);

  fprintf(stderr, "\n Cell: (%i)(%i)", alive_row, alive_column);       
}

ここで、line は fgets の内容が格納される文字配列 (文字列) であり、alive_row、& alive_column は整数です。

しかし、何らかの理由で出力は次のようになります。

3 live cells

 Cell: (0)(0)
 Cell: (2)(1)
 Cell: (2)(2)
 Cell: (2)(3)
 Cell: (2)(3)

問題は、最初のセルが (0)(0) と出力されるのはなぜですか? なぜこれが印刷されているのかわかりません...明らかに明白である場合は申し訳ありません...

編集:そして明らかに、最後のセル(2)(3)が繰り返されています。

4

3 に答える 3

1

j個の1桁を扱っているので、単純line[0]-'0' にline [0]を整数に変換するために使用します。最初のスキャンでは、ファイル ストリームが次の行に移動するように 5 バイトをスキャンするだけです。

   #include<stdio.h>

    int main()
    {

    FILE *fp;
    int alive_row;
    int alive_column,livecells;


    char line[10];
    fp=fopen("file1","r");
    fgets(line,5 , fp);
    livecells = line[0]-'0';
    fprintf(stderr, "\n %i live cells\n", livecells);

    while ( fgets(line, 5, fp)!=NULL)
    {
    //  puts(line);
      alive_row = line[0]-'0';
      alive_column = line[2]-'0';

      fprintf(stderr,"\n Cell: (%i)(%i)\n", alive_row, alive_column);
    }
    fclose(fp);
    }

これにより、行を行と列の 2 つの値に分割できます。

ファイル1:

12
2 1
2 2
2 3
50 5
30 20
5 30
30 330
3390 447
12 1234
0 0
1234 1
154 0 

コード:

#include<stdio.h>
#include<string.h>

int main()
{

    FILE *fp;
    int alive_row=0;    
    int alive_column=0,livecells;
    int column=0,i;

    char line[10];
    fp=fopen("file1","r");
    fgets(line,5, fp);       //read first line
    livecells = atoi(line); //convert into int
    fprintf(stderr, "\n %i live cells\n", livecells);

    while ( fgets(line, 12, fp)!=NULL)      //read next lines
        {
        for(i=0;i<strlen(line)-1;i++)      //loop to separate rows and columns , here if space occurs make flag column as 1
            {
            if(line[i]!=' ' && column!=1 )     
            alive_row = 10*alive_row+line[i]-'0'; //convert into integers
            else
                {
                if(line[i]==' ')
                i=i+1;
                alive_column=10*alive_column+line[i]-'0';
                column=1; //you can write this statement just above if but you need to add two brace 
                }
            }

        printf(" Cell:(%d)(%d)\n\n", alive_row, alive_column);
        alive_row=0;   //after every iteration just make these value to default. 
        alive_column=0;
        column=0;
        }
    fclose(fp);
}

出力

 12 live cells

 Cell:(2)(1)

 Cell:(2)(2)

 Cell:(2)(3)

 Cell:(50)(5)

 Cell:(30)(20)

 Cell:(5)(30)

 Cell:(30)(330)

 Cell:(3390)(447)

 Cell:(12)(1234)

 Cell:(0)(0)

 Cell:(1234)(1)

 Cell:(154)(0)
于 2013-09-14T10:13:12.640 に答える
0

fgets()\n可能であれば文字を読み取ります。
そうでない場合は\n、次の読み取り操作で読み取られます。

あなたの呼び出しはfgets(line, 2, fp);であるため、1 文字のみが読み取られ、2 番目はヌル文字で埋められます。つまり、line[0] == '3' および line[1] == '\0' です。

行末は後で読み取られるため、while()ループ内の最初の読み取り操作は次のとおり"\n"です。atoiこれにより、 (あなたの場合はゼロ)で 任意の結果が生成されます。

次のことを考慮してください。

fgets(line, N, fp) は、ファイル fp から、可能な場合は \n を含め、stdin から最大で N - 1 文字を読み取ります。結果は一列に並べられ、常に最後に \0 文字用のスペースが確保されます。

于 2013-09-14T10:04:36.993 に答える