使用std从文件读取C ++

时间:2015-09-02 16:20:33

标签: c++ std

我正在尝试从文件中读取,我知道该怎么做:

#include <iostream>
#include <iterator>
#include <fstream>
#include <vector>
using namespace std;

int main()
{
    std::string filename = "data.txt";
    std::ifstream from(filename);
    std::vector<int> values((std::istream_iterator<int>(from)), std::istream_iterator<int>());
    return 0;
}

我的问题是如何以功能方式做同样的事情:

int fromfile(std::string filename, std::vector<int> &values)
{
... 
    return 0;
}

原生方式不起作用:

int fromfile(std::string filename, std::vector<int> &values)
{
    std::ifstream from(filename);
    values((std::istream_iterator<int>(from)), std::istream_iterator<int>());
    return 0;

}

2 个答案:

答案 0 :(得分:2)

您的功能方式不起作用,因为您尝试在已构造的对象上使用构造函数 - 所以看起来您正在尝试在operator()上调用vector,这样做不存在。但是,vector确实有assign成员函数执行相同的操作,而不需要额外的parens:

int fromfile(std::string filename, std::vector<int> &values)
{
    std::ifstream from(filename);
    values.assign(std::istream_iterator<int>(from), std::istream_iterator<int>());
    return 0;
}

虽然真正的功能方式可能看起来像这样(C ++ 11) - 使用函数返回 vector

std::vector<int> fromfile(std::string filename)
{
    std::ifstream from(filename)
    return {std::istream_iterator<int>(from), std::istream_iterator<int>{}};
}

如果只有int,那么return 0返回就有点无用......

答案 1 :(得分:1)

尽管Barry已经给你答案,但算法的另一种方法是调用std :: copy:

std::copy(std::istream_iterator<int>(from), std::istream_iterator<int>(),
          std::back_inserter(values));