C++正在将文本文件读取到结构数据成员中



我目前正在尝试将文本文件加载到结构数据成员中。每个数字用逗号分隔。

#include<string>
#include<sstream>
using namespace std;
struct server{
    bool isBusy;
};
struct pass{
    double arrivalTime = 0;
    double serviceTime = 0;
    int classType = 0;
};
int main(){
    string fileName;
    string line;
    pass Pass;
    cout << "Enter file name: ";
    cin >> fileName;
    ifstream fin(fileName);
    while (getline(fin, line, ','))
    {
        /*NEED HELP HERE*/
        fin >> Pass[0].arrivalTime;
        fin >> Pass[0].serviceTime;
        fin >> Pass[0].classType;
    }
}

下面是一个文本文件的示例。

0.951412936,2.131445423,0
1.902743503,2.010703852,0
2.537819984,2.326199911,0
3.425838997,1.603712153,0
3.502553324,0.998192867,0
3.917348666,1.49223429,0
4.391605986,0.831661367,0
4.947059678,0.8557003,0
5.429305232,2.42029408,0

文本文件中的数据遵循以下格式:

arrivalTime,serviceTime,classType

正如你所看到的,我已经将行拆分并使用逗号分隔符将其存储在"行"中,但我不确定如何在while循环中将每个数字加载到结构中。

如有任何帮助,我们将不胜感激。

为结构定义istream operator >>。类似的东西

struct pass {
    double arrivalTime = 0;
    double serviceTime = 0;
    int    classType   = 0;
    friend std::istream & operator >>(std::istream & in, pass & p) {
        char c;
        in >> p.arrivalTime >> c >> p.serviceTime >> c >> p.classType;
        return in;
    }
};

然后,简单的

pass Pass;
fin >> Pass;
while (getline(fin, line))
{
    sscanf(line.c_str(), "%lf,%lf,%d", &arrivalTime, &serviceTime, &classType);
}

此循环错误:

while (getline(fin, line, ','))
{
    /*NEED HELP HERE*/
    fin >> Pass[0].arrivalTime;
    fin >> Pass[0].serviceTime;
    fin >> Pass[0].classType;
}

您正在读取从流到下一个','字符的所有内容,然后尝试从流中读取更多内容。

给定输入文件:

0.951412936,2.131445423,0
1.902743503,2.010703852,0
2.537819984,2.326199911,0

您的程序将"0.951412936"读入line(并丢弃','(,然后尝试将下一个输入读入Pass[0].arrivalTime,但下一个输出是2.131445423,即serviceTime(您已将其读入line(。

正如Shreevardhan所建议的,您可以定义一个运算符来从流中读取结构。我会让它更可靠:

struct ExpectedChar { char expected; };
// read a character from a stream and check it has the expected value
std::istream& operator>>(std::istream& in, const ExpectedChar& e)
{
  char c;
  if (in >> c)
    if (c != e.expected)  // failed to read expected character
      in.setstate(std::ios::failbit);
  return in;
}
// read a struct pass from a stream
std::istream& operator>>(std::istream& in, pass& p)
{
  ExpectedChar comma{ ',' };
  in >> p.arrivalTime >> comma >> p.serviceTime >> comma >> p.classType;
  return in;
}

如果输入文件不符合预期格式,这将停止读取。现在你可以做:

while (fin >> Pass)
{
  // do something with each pass
}
if (!fin.eof())  // stopped reading before end-of-file
  throw std::runtime_error("Invalid data in input file");

这将继续从文件中读取pass,直到读取失败,可能是因为它到达了文件的末尾,也可能是因为文件中有一些坏数据。如果有坏数据,它会抛出一个异常。

#include<string>
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
struct server{
    bool isBusy;
};
struct pass{
    double arrivalTime;
    double serviceTime;
    int classType;
    friend std::istream & operator >>(std::istream &in, pass &p) {
        char c;
        in >> p.arrivalTime >> c >> p.serviceTime >> c >> p.classType;
        return in;
    }
};
int main(){
    string fileName;
    string line;
    cout << "Enter file name: ";
    cin >> fileName;
    ifstream fin(fileName.c_str(), ifstream::in);
    vector<pass> passes;
    pass Pass;
    while (fin>>Pass)
      passes.push_back(Pass);
    for(vector<pass>::const_iterator iter = passes.begin(); 
    iter != passes.end();
    ++iter)
      std::cout<<iter->arrivalTime<<" "<<iter->serviceTime<<" "
      <<iter->classType<<std::endl;

}

这里有提示;

string line;
string temp;            
string::size_type sz;
while (getline(cin, line))   
{
    istringstream ss( line );
    getline( ss, temp, ',' );  
    double arrivalTime = stod(temp, &sz);
    getline( ss, temp, ',' );  
    double serviceTime = stod(temp, &sz);
    getline( ss, temp, ',' );  
    double classType = stod(temp, &sz);
    cout << arrivalTime << ' ' 
         << serviceTime << ' ' 
         << classType   << endl;
}

最新更新