3

2 つのファイルがあり、どちらも 47k 行です。各ファイルの行を同時に読み取ろうとしています。問題は、各ファイルの最初の行だけが読み取られることです。それは私が書いたコードです:

id_region = fopen(argv[3], "r");
prediction=fopen(argv[4], "r");

int prediction_class, class, region;

while ((fscanf(id_region,"%d  1:%d",&class,&region) == 2) && (fscanf(prediction,"%d",&prediction_class) == 1))
{

     fprintf(stderr,"\nRegião %d",region);
     fprintf(stderr,"\nClasse %d",class);
     fprintf(stderr,"\nPredição %d",prediction);
}

私のコードの問題は何ですか?

編集:このコードを試しましたが、実行するとセグメンテーション違反が発生しました。ここで何が問題なのですか?

int main(int argc, char** argv)
{

    FILE* id_region;
    FILE* prediction;   

    id_region = fopen(argv[1], "r");
    prediction=fopen(argv[2], "r");

    char line[50];
    char line2[50];

    int prediction_class,region,temp1,temp2;

    while((fgets (line,10,prediction) != NULL) && (fgets (line2, 10, id_region)!=NULL))
    {
      //formating the input
      temp1=fscanf(line,"%d",&prediction_class);
      temp2=fscanf(line2,"%d",&region);

      fprintf(stderr,"\nRegion: %d",region);
      fprintf(stderr,"\nPrediction: %d",prediction_class);
    }

    fclose(prediction);
    fflush(prediction);
    fclose(id_region);
    fflush(id_region);   

    return(0);


 }

このコードで解決 - ありがとう!

 int main(int argc, char** argv)
 {

  FILE* id_region;
  FILE* prediction; 

  id_region = fopen(argv[1], "r");
  prediction=fopen(argv[2], "r");

  char line[50];
  char line2[50];

  int prediction_class,region,class;
  contador=0;

  while((fgets(line,10,prediction)!= NULL) && (fgets(line2, 20, id_region)!=NULL))
 {


  sscanf (line,"%d", &prediction_class);
  sscanf (line2,"%d  1:%d",&class,&region);
  fprintf(stderr,"\nRegion: %d",region);
  fprintf(stderr,"\nPrediction: %d",prediction_class);



 }


   fclose(prediction);
   fflush(prediction);
   fclose(id_region);
   fflush(id_region);   

    return(0);


}
4

3 に答える 3

5

の代わりにfscanf()、 を使用fgets()して各行を取得し、 を使用sscanf()して行からフォーマットされた入力を取得する必要があります。


編集された質問について、私は少なくとも 2 つの問題を発見しましfscanf()sscanf()。そして、ストリームを で閉じたfflush() fclose()に使用しています。実際fclose()にはストリームがフラッシュされます。手動でフラッシュする必要はありません。

于 2013-10-23T12:30:34.907 に答える
1

あなたはラインを言った。次に、行末文字をスキップする必要があります。を追加\nするfscanfか、 を使用しますfseek

于 2013-10-23T12:29:30.287 に答える
1

まず、それは何ですか?

int prediction_class, class, region;

classとしてint

fgets (char *_Buf, int _MaxCount, FILE *_File)仕事をより良くします。現在のプロジェクトで使用していますが、問題なく動作します。

于 2013-10-23T12:34:29.717 に答える