繁体   English   中英

C ++将文本文件读入struct数据成员

[英]C++ Reading text file into struct data members

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

#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

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

到达时间,服务时间,类类型

如您所见,我已经使用逗号定界符将行拆分并存储在“行”中,但是我不确定如何在while循环中将每个数字加载到结构中。

任何帮助,将不胜感激。

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

为您的结构定义一个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;
#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;

}

此循环是错误的:

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 ,直到读取失败,这是因为它到达了文件的末尾,或者是因为文件中存在一些错误的数据。 如果有不良数据,它将引发异常。

这是提示;

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM