C++ C++;使用std读取文件

C++ C++;使用std读取文件,c++,std,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<

我正在尝试读取文件,我知道如何执行此操作:

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
std::string filename=“data.txt”;
std::ifstream from(文件名);
std::向量值((std::istream_迭代器(from)),std::istream_迭代器();
返回0;
}
我的问题是如何以功能的方式做同样的事情:

int fromfile(std::string filename, std::vector<int> &values)
{
... 
    return 0;
}
intfromfile(std::string文件名、std::vector和value)
{
... 
返回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;

}
intfromfile(std::string文件名、std::vector和value)
{
std::ifstream from(文件名);
值((std::istream_迭代器(from)),std::istream_迭代器();
返回0;
}

您的函数方式不起作用,因为您试图在已构造的对象上使用构造函数-因此看起来您试图在您的
向量上调用
操作符()
,该向量不存在。但是,
vector
确实有一个成员函数,可以做同样的事情,而不需要额外的参数:

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;
}

因为如果您只有
return 0
,那么使用
int
返回就有些无用了

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

std::copy(std::istream_iterator<int>(from), std::istream_iterator<int>(),
          std::back_inserter(values));
std::copy(std::istream\u迭代器(from),std::istream\u迭代器(),
std::back_插入器(值));

谢谢你的回答,Barry,但据我所知,返回向量是一个复制过程,如果它包含10^6个以上的元素,可能会很昂贵。返回整数的想法是为了避免复制过程。@Maxim.K。如果您正在复制,则为True。但我们不是。如果您只需要值(例如,
vector v=fromfile(“某物”);
,则不会调用副本-请参阅返回值优化。此外,即使您已经构造了向量(例如,
v=fromfile(“某物”);
),这仍然只会调用移动。@Barry,移动只会在C++11或更高版本中发生。在C++98/03中,它将是一个副本。@NathanOliver,现在是2015年。除非另有明确说明,否则我默认为C++11。RVO在C++03中仍然存在。@Barry,是的,RVO存在,但如果
v
已经存在,则
v=fromfile(“其他东西”);
需要复制。
std::copy(std::istream_iterator<int>(from), std::istream_iterator<int>(),
          std::back_inserter(values));