【问题标题】:Reading text file c++ (not able to display other lines)读取文本文件c ++(无法显示其他行)
【发布时间】:2014-05-21 15:25:51
【问题描述】:
    char fname[20];
    char lname[20];
    int grade[10];
    double avg=0.00;

    fstream infile("C:\\Users\\Hady Zn\\Desktop\\hady.txt", ios::in);
    fstream outfile("C:\\Users\\Hady Zn\\Desktop\\hady1.txt", ios::out);


    while(infile>>fname>>lname)
    {
        outfile<<fname<<" "<<lname<<" ";
        for(int i=0; i<10; i++)
            grade[i]=0; 

    for(int i=0; i<10; i++)
    {

        infile>>grade[i];

        if(grade[i]>=0 && grade[i]<=100)
        {
        outfile<<grade[i]<<" ";
        avg+=grade[i];
        }

    }

    outfile<<avg/10.00<<endl;
    avg=0.00;

    }

所以问题是我需要从文本文件中读取姓氏(空格)名字(空格)然后 10 个测验等级(每个等级之间的空格)并将相同的数据写入输出文件,平均值为一行的每一端有 10 个测验。 我面临的问题是,如果我在一行上的测验少于 10 个,它将不会显示剩余的行。(我希望它仍然给我给出的平均成绩,例如,如果给我 7 3 年级将是零) 我尝试解决它,但它就是行不通。有什么想法可以解决这个问题吗?请帮忙。谢谢

【问题讨论】:

标签: c++ text-files fstream ifstream lines


【解决方案1】:

为了执行此类检查,最好从输入文件中逐行读取文本并处理每一行以提取数据。

string line
while ( getline(infile, line) )
{
   istringstream sstream(line); 
   sstream >> fname >> lname;
   if (!sstream )
   {
      continue;
   }

   outfile<<fname<<" "<<lname<<" ";
   for(int i=0; i<10; i++)
   {
      grade[i]=0; 
      sstream>>grade[i];
      if ( !sstream )
      {
         break;
      }

      if(grade[i]>=0 && grade[i]<=100)
      {
         outfile<<grade[i]<<" ";
         avg+=grade[i];
      }
   }
}

更新,以回应 OP 的评论:

您可以避免逐行读取输入文件并处理每一行。这是我对循环的建议更改。

while(infile>>fname>>lname)
{
   outfile<<fname<<" "<<lname<<" ";

   for(int i=0; i<10; i++)
   {
      grade[i]=0; 
      infile>>grade[i];
      if ( !infile )
      {
         infile.clear();
         break;
      }

      if(grade[i]>=0 && grade[i]<=100)
      {
         outfile<<grade[i]<<" ";
         avg+=grade[i];
      }
   }

   outfile<<avg/10.00<<endl;
   avg=0.00;

}

【讨论】:

  • 不应该是infile &gt;&gt; linegetline(infile, line)
  • 更好while ( getline(infile,line) )
  • 我同意你逐行阅读的想法。但是我可以问一下是否有任何方法可以绕过字符串?或者这是唯一可能的方法?
  • @0x499602D2 和 πάντα ῥεῖ,感谢您指出疏忽。现在已经修好了。
  • @RSahu 哇,非常感谢!第二种方法效果很好,但我无法说出我在程序中犯的错误。你能解释一下吗?
猜你喜欢
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 2020-07-24
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
相关资源
最近更新 更多