C ++使用std从文件中读取
C++ reading from file using 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;
}
你的函数式方法不起作用,因为你正试图在一个已经构造的对象上使用构造函数 - 所以看起来你正试图在你的 vector
上调用 operator()
,这是不存在的。但是,vector
确实有一个 assign
成员函数可以做同样的事情,而不需要额外的括号:
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) - 使用函数 return vector
:
std::vector<int> fromfile(std::string filename)
{
std::ifstream from(filename)
return {std::istream_iterator<int>(from), std::istream_iterator<int>{}};
}
因为 int
return 如果你只有 return 0
...
就有点没用了
尽管 Barry 已经给了你答案,但使用算法实现此目的的另一种方法是调用 std::copy:
std::copy(std::istream_iterator<int>(from), std::istream_iterator<int>(),
std::back_inserter(values));
我正在尝试从文件中读取,我知道该怎么做:
#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;
}
你的函数式方法不起作用,因为你正试图在一个已经构造的对象上使用构造函数 - 所以看起来你正试图在你的 vector
上调用 operator()
,这是不存在的。但是,vector
确实有一个 assign
成员函数可以做同样的事情,而不需要额外的括号:
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) - 使用函数 return vector
:
std::vector<int> fromfile(std::string filename)
{
std::ifstream from(filename)
return {std::istream_iterator<int>(from), std::istream_iterator<int>{}};
}
因为 int
return 如果你只有 return 0
...
尽管 Barry 已经给了你答案,但使用算法实现此目的的另一种方法是调用 std::copy:
std::copy(std::istream_iterator<int>(from), std::istream_iterator<int>(),
std::back_inserter(values));