【问题标题】:Read multiple files with the same number of lines in the same loop in C在C中的同一循环中读取具有相同行数的多个文件
【发布时间】:2013-11-01 17:20:25
【问题描述】:

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

标签: c file stream scanf


【解决方案1】:

您应该使用fgets() 来获取每一行,而不是fscanf(),并使用sscanf() 从行中获取格式化输入。


对于编辑后的问题,我发现至少有两个问题:您仍在使用fscanf(),而它应该是sscanf()。而您正在使用fflush() 使用fclose() 关闭流。其实fclose() 会导致流刷新,你不需要手动刷新。

【讨论】:

  • 我应该把 fscanf 放在一个循环中,而 fgets 也放在一个循环中吗?你能看到我上面的编辑吗?
  • 谢谢,我轻轻地呼吸以保持冷静并尝试了您的解决方案。现在可以了!
【解决方案2】:

你说了行。然后,您必须跳过行尾字符。在fscanf 中添加\n 或使用fseek

【讨论】:

    【解决方案3】:

    首先,那是什么?

    int prediction_class, class, region;
    

    classint ?

    fgets (char *_Buf, int _MaxCount, FILE *_File) 会做得更好。 我在我当前的项目中使用它,它工作正常。

    【讨论】:

    • 对不起,类是一个变量,我只是从我的母语翻译它的名字:-)
    • 但是如何在一个循环中同时处理 2 个文件呢?
    • 你用fgets (char *_Buf, int _MaxCount, FILE *_File) 读这行,然后用sscanf(const char *_Src, const char *_Format, ...) 格式化,就像余浩已经说过的那样……
    • 我试过这段代码,但它不起作用。我很抱歉,但怎么了? 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);我希望在每次循环迭代中读取变量预测、类和区域,但此代码冻结
    • 请编辑您的问题并更新当前代码,我不知道新变量(在您上面的评论中提到)具有哪种类型。请发布完整的代码,a & b 似乎没有被任何东西使用。
    猜你喜欢
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2020-03-05
    • 2014-02-19
    相关资源
    最近更新 更多