【问题标题】:C++ Reading file with some information omittedC ++读取文件,省略了一些信息
【发布时间】:2017-09-12 03:58:05
【问题描述】:

我有一个结构如下的文本文件:

G 15324 2353
D 23444 
Q 23433 32565

我想将每条信息存储到一个变量中并将其包含在一个向量中:

ifstream fin;
fin.open("file.txt");
vector<SomeClass> test;
SomeClass temp;
while (fin >> temp.code >> temp.datapoint>> temp.dataleague)
{
      test.push_back(temp);
}

但是,有时在文件中第三个值 (temp.dataleague) 会被省略并留空。显然我上面的代码将不起作用,因为它只会在该字段中放入垃圾。当不确定第三个字段是否包含值时,我该怎么做?

【问题讨论】:

    标签: c++ file vector


    【解决方案1】:

    您可以尝试使用:

    std::istream::getline
    

    这将允许您获取缓冲区中的每一行,然后根据需要处理它。

    char buffer[256];
    fin.getline(buffer,256);
    

    然后您可以使用以下方法解析不同的字段:

    std::string line = std::string(buffer);
    int index = line.find(' ');
    if (index>0)
        std::cout << "My value is: " << line.substr(0,index);
    

    以你为例:

    ifstream fin;
    fin.open("file.txt");
    vector<SomeClass> test;
    SomeClass temp;
    char buffer[256];
    
    while (!fin.eof())
    {
        fin.getline(buffer,256);
        auto line = std::string(buffer);
        std::vector<std::string> tokens;
        int start = 0, end = line.find(' ');
        while (end!=-1)
        {
            tokens.push_back(line.substr(start,end-1));
            start = end +1;
            end = line.find(' ');
        }
        if (start<line.size())
            tokens.push_back(line.substr(start));
        if (tokens.size()==3)
        {
            test.code = tokens[0];
            test.datapoint= tokens[1];
            test.dataleague= tokens[2];
            test.push_back(temp);
        }
    }
    

    【讨论】:

      【解决方案2】:

      也许是这样的。读入整行,然后在已知的分隔符 (' ') 上对其进行解析。一旦你知道有多少项目在线,你可以使用 istringstream 以预期的方式将它们拉出来。

      #include <sstream>
      #include <algorithm>
      #include <iostream>
      #include <vector>
      
      using namespace std;
      
      int main()
      {
        ifstream fin("file.txt");
        vector<SomeClass> test;
        string line;
      
        while (getline(fin, line))
        {
           istringstream iss(line);
           char code = 'X';
           int datapoint = 99999, dataleague = 99999;
           size_t n = count(line.begin(), line.end(), ' ');
           if (n == 0) iss >> code;
           else if (n == 1) iss >> code >> datapoint;
           else if (n == 2) iss >> code >> datapoint >> dataleague;
      
           SomeClass temp(code, datapoint, dataleague);
           test.push_back(temp);
        }
      
        return 0;
      }
      

      【讨论】:

      • 非常好,简单的方法来解决这个问题。谢谢
      猜你喜欢
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多