读取不同长度的行向后c ++

时间:2014-04-16 21:12:55

标签: c++ arrays input

我有一个文本文件,我需要从中读取数据,这些数据将在以后进入各种数组。文本文件如下所示:

 1 5.154600E-05 1.329887E-02 1.907202E-03   3      -1    8937    8889       1       0     890    1532    1533
 2 4.639140E-03 9.845286E-03 1.659781E-02   1    9708       0       0    1617
 3 1.329887E-02 1.329887E-02 1.108239E-02   4    8497    5442       0    5711       0       1    1611    1619     889    1618
 4 1.030920E-04 5.154600E-05 1.412360E-02   3      -1    6966    6965       1       0     888    1620    1330
 5 6.030882E-03 6.546342E-03 1.030920E-04   2    8238    6002       0       0    1622    1621
 6 9.484464E-03 5.154600E-05 4.072134E-03   2    6104    5455       0       0    2481    1112

1,我需要取出特定的栏目(在这种情况下是第5栏)。线条的大小不相等,在第5列之后我无法打破阅读。 cin.ignore没有帮助。

第2列,第5列总是一个整数,比如N,然后(可能在一个单独的函数中)我需要读取最后N个相同的行并将它们存储到数组中。我不知道怎么做。

以下是代码的一部分:

while (!myfile.eof())

  {
//     myfile.ignore (50, '\n'); // This is just a try. 5th col. always ends at 50th charachter of line. It didn't work!
    double a,b,c,d,e;

    myfile >> a >> b >> c >> d >> e;

    if (minsize>e)
      minsize=e;
    if (maxsize<e)
      maxsize=e;

    frequency2[int(e)]++;
  }

任何帮助?

3 个答案:

答案 0 :(得分:0)

您可以使用std::getline在每次迭代中获取整行,然后使用std::istringstream来解析列。像这样:

std::string buffer;
std::getline(myfile, buffer);
std::istringstream iss(buffer);

// Do your stuff
double a, b, c, d, e;
iss >> a >> b >> c >> d >> e;

答案 1 :(得分:0)

我建议你使用一个反转大小的字符串,如60字节。 然后通过char读取char。如果字符是空格/换行符字符串大小&gt; 0 您应处理字符串中的数据并清除字符串中的数据。如果尺寸== 0 ,您应继续

void handle(std::string& data)
{
    if(data.size())
    {
        //Handle Input
        data.clear();
    }
}

std::string buf(60);
while(file.isgood())
{
    char c = file.get();
    if(!file.isgood())
        break;

    switch(c)
    {
        case '\n':
        case ' '://Probably you need more cases here just debug to find out
        handle(buf); 
        break;      
        default:
        buf.push_back(c);
        break;
    }
}

答案 2 :(得分:0)

完成其他解决方案:

  • getline是逐行读取文件的好方法
  • 你可以使用(boost)tokenizer来构建一个可行的迭代
  • 你可以使用(boost)词法强制转换来解析来自这个可迭代的数据

类似

while(file.good())
{
    string line;
    getline(file, line);

    if(line.empty())
        continue;

    boost::tokenizer<> tok(line);
    boost::tokenizer<>::iterator tokiter = tok.begin();

    double ex1  = boost::lexical_cast<double>(*tokiter);
    tokiter++;
    float ex2  = boost::lexical_cast<float>(*tokiter);
    //etc..
    cout << ex1 << " " << ex2 << endl;
}

http://www.boost.org/doc/libs/1_55_0b1/libs/tokenizer/tokenizer.html

http://www.boost.org/doc/libs/1_55_0/doc/html/boost_lexical_cast.html