如何从fgets读取整个整数流并推回到1D向量?

时间:2015-09-17 15:32:08

标签: c++ file vector ifstream fgets

您好我正在使用c ++并且我使用fgets读取文件,我正在使用while循环和sscanf来推回我的vector double,而我想使用单行执行它,就像ifstream的情况一样但我不想用get line。

%% My stream of data
  151  150  149  148  147  146  145  144  143  143  141  139  138  137  135 
  132  130  130  129  128  127  127  128  129  130  129  128  127  126  127 
  127  127  127  128  128  128  129  130  130  131  131  132  132  133  133 

%% My code
vector<double> vec_TEC1D;
double temp_holder = 0.0;

while(!feof(fileptr))
    {
      fgets(line, LENGTH_LINE, fileptr);
      .....
      while(strstr(line, '\n') != NULL){
                  sscanf(line, "%lf", &temp_holder);
                  vec_TEC1D.push_back(temp_holder);
              }
      }     

我已经在上面使用2 while循环用于其他目的,因此我想避免这个..

感谢您的帮助! :) 普里亚

2 个答案:

答案 0 :(得分:2)

为什么不使用std::ifstream

std::ifstream fin(filename);
std::vector<double> vec_TEC1D{ std::istream_iterator<double>{fin},
                               std::istream_iterator<double>{}};

(改编自this answer)。

答案 1 :(得分:0)

以下是一些可能对您有所帮助的提示:

所以你的代码可能如下:

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>


int main(int argc, char* argv[]) {
  if(argc < 2)
    return -1;

  std::ifstream input(argv[1]);
  std::vector<double> data;
  std::string line;
  while(std::getline(input, line)) {
    std::stringstream converter(line);
    std::copy(std::istream_iterator<double>(converter),
          std::istream_iterator<double>(),
          std::back_inserter(data));
  }

  // Do something with the data, like print it...
  std::copy(begin(data), end(data), std::ostream_iterator<double>(std::cout, " "));
  return 0;
}

有更简洁的方法可以做到这一点,但我建议像处理代码一样处理每行separatley。也许你的文件包含其他行,你想以不同的方式处理它们。