在C语言中使用同一个循环读取具有相同行数的多个文件

3

我有两个文件,每个文件都有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);


}

当你需要使用C时,请不要标记为C++ - crashmstr
3个回答

5

应该使用 fgets() 来获取每一行而不是使用 fscanf(),然后再使用 sscanf() 从这些行中获取格式化输入。


对于修改过的问题,我至少发现了两个问题:你仍在使用 fscanf(),而应该使用 sscanf()。还有,在使用 fclose() 关闭流之后使用 fflush() 是错误的。实际上,fclose() 会导致流被刷新,你不需要手动刷新它们。


我应该将fscanf放在循环中,fgets也放在循环中吗?你能看到我上面的编辑吗? - mad
谢谢,我轻轻地呼吸以保持冷静,并尝试了您的解决方案。现在它可以工作了! - mad

1
首先,那是什么?
int prediction_class, class, region;

class 作为 int 类型?

fgets (char *_Buf, int _MaxCount, FILE *_File) 更适合这个任务。我正在我的当前项目中使用它,它工作得很好。


抱歉,class是一个变量,我只是从我的母语中翻译了它的名称 :-) - mad
但是如何在循环中同时处理2个文件? - mad
你可以使用 fgets(char *_Buf, int _MaxCount, FILE *_File) 读取一行,并像 Yu Hao 已经说过的那样使用 sscanf(const char *_Src, const char *_Format, ...) 进行格式化。 - Blacktempel
我尝试了这段代码,但它不起作用。对不起,请问问题出在哪里?while((fgets (line,1,prediction) != NULL) && (fgets (line2, 10, id_region)!=NULL)) {
a=fscanf(line,"%d",&prediction); b=fscanf(line2,"%d 1:%d",&class,&region);我希望在每个循环迭代中读取变量prediction、class和region,但是这段代码会冻结。
- mad
请编辑您的问题并更新当前代码,我不知道新变量(在您上面的评论中提到)是哪种类型。请发布完整的代码,因为似乎没有任何东西使用 a 和 b。 - Blacktempel

1
你说了一行话。那么你必须跳过该行的结束符。在 fscanf 中添加 \n 或使用 fseek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接