【问题标题】:How to read from multiple lines in a file?如何从文件中的多行读取?
【发布时间】:2021-12-17 09:58:25
【问题描述】:

我正在学习 C++,并且在处理文件时遇到了一些困难。这是我正在尝试做的一个小练习。该程序旨在从文件中读取并将其设置为适当的变量。文本文件是这样的:

阿达拉·斯塔尔 94
大卫·斯塔尔 91
索菲亚·斯塔尔 94
玛丽亚·斯塔尔 91
丹妮尔 DeFino 94

#include <fstream>
#include <iostream>
using namespace std;

const int MAXNAME = 20;

int main()
{
    ifstream inData;
    inData.open("grades.txt");

    char name[MAXNAME + 1]; // holds student name 
    float average;          // holds student average

    inData.get(name, MAXNAME + 1);

    while (inData)
    {
        inData >> average;
        cout << name << "has an average of " << average << endl;

        //I'm supposed to write something here
    }

    return 0;
}

当我尝试运行代码时,只有第一行被读取并显示,然后程序结束。更具体地说,输出是

Adara Starr         has an average of 94
Adara Starr         has an average of 0

如何从 txt 文件中读取下一行?我也用while (inData &gt;&gt; average) 代替了 inData 条件,但它也做了同样的事情,减去第二个“Adara Starr 的平均值为 0”

【问题讨论】:

    标签: c++ fstream


    【解决方案1】:

    您只读取一个名称,然后循环读取平均值。这与文件的内容不匹配。

    使用getline读取行,然后使用字符串流解析行:

    #include <sstream>
    #include <string>
    #include <iostream>
    
    int main()
    {
        std::stringstream ss{ R"(Adara Starr 94
    David Starr 91
    Sophia Starr 94
    Maria Starr 91
    Danielle DeFino 94)"};
    
        std::string line;
        while (std::getline(ss,line)) {
            std::stringstream linestream{line};
            std::string first;
            std::string last;
            double avg;
            linestream >> first >> last >> avg;
            std::cout << first << " " << last << " " << avg << "\n";
        }   
    }
    

    【讨论】:

      【解决方案2】:

      我希望这会有所帮助:

      #include<iostream>
      #include<fstream>
      #include<string>
      using namespace std;
      
      const int MAXNAME = 20;
      
      int main() {
          ifstream inData("input.txt");
          string str = "";
      
          while (!inData.eof()) {//use eof=END OF FILE
              //getline(inData, str); use to take the hole row
      
              /*can use string also
              string firstName;
              string lastName;
              string avg;*/
      
              char firstName[MAXNAME];
              char lastName[MAXNAME];
              float avg;
      
              //you can read from a file like you read from console(cin)
              inData >> firstName >> lastName >> avg;//split the row
      
              cout << firstName << " " << lastName << " " << avg<<"\n";
              
          }
      
          inData.close();
          return 0;
      }
      

      输出: 阿达拉·斯塔尔 94

      大卫·斯塔尔 91

      索菲亚·斯塔尔 94

      玛丽亚·斯塔尔 91

      丹妮尔·德菲诺 94

      【讨论】:

      • 如何确保输入不会导致缓冲区溢出,例如如果名称的长度为 MAXNAME 个字符或更多?
      【解决方案3】:

      希望它对您有所帮助,但我想提醒您,由于内部 for 循环仅检查数字,如果 average 由浮点数组成,您将丢失数据。

      #include <fstream>
      #include <iostream>
      #include <stdexcept>
      #include <string>
      using namespace std;
      
      const int MAXNAME = 20;
      
      int main()
      {
          ifstream inData;
          inData.open("grades.txt");
      
          for(string line; getline(inData, line);) {
              // parse line
              // get number index
              size_t num_index = str.length() - 1;
              for(; num_index >= 0 && is_digit(str[num_index]); --num_index)
                  ;
      
              string name = line.substr(0, num_index - 1); // skip space char
      
              if(name.length() > MAXNAME) 
                  throw runtime_error("Name could not be more that " + MAXNAME + " length");
      
              float avarageStr = stof(line.substr(num_index + 1));
      
              cout << name << "has an average of " << average << endl;
      
              //I'm supposed to write something here
          }
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-19
        相关资源
        最近更新 更多