我编写了一个函数,可以从文件到向量读取未知数量的数据(在列中)。
#include <iostream>
#include <vector>
#include <fstream> // file writing
#include <cassert>
void ReadFromFile(std::vector<double> &x, const std::string &file_name)
{
std::ifstream read_file(file_name);
assert(read_file.is_open());
size_t lineCount = 0;
while (!read_file.eof())
{
double temp;
read_file >> temp;
x.at(lineCount) = temp;
if (lineCount == x.size() - 1) { break; } // fixes the out of range exception
lineCount++;
}
read_file.close();
}
int main()
{
size_t Nx = 7;
size_t Ny = 7;
size_t Nz = 7;
size_t N = Nx*Ny*Nz;
// Initial Arrays
std::vector <double> rx(N);
std::string Loadrx = "Loadrx.txt";
ReadFromFile(rx, Loadrx);
}
但是,在将文件中的数据复制到向量中之后,lineCount会增加一个额外的时间。有没有比我写过的if语句更优雅的方法来解决这个问题?
编辑:很明显,我不会上传数据文件。代码完美编译我只是在if语句中寻找改进(如果存在)。答案 0 :(得分:4)
我编写了一个函数,用于读取从文件到向量的未知数量的数据(在列中)。
从“列”(或其他常规格式化)文件读取未知数量的数据的最优雅(并且,我认为,惯用)方法之一是使用istream迭代器:
void ReadFromFile(std::vector<double> &x, const std::string &file_name)
{
std::ifstream read_file(file_name);
assert(read_file.is_open());
std::copy(std::istream_iterator<double>(read_file), std::istream_iterator<double>(),
std::back_inserter(x));
read_file.close();
}
用法:
int main()
{
// Note the default constructor - we are constructing an initially empty vector.
std::vector<double> rx;
ReadFromFile(rx, "Loadrx.txt");
}
如果您想编写一个包含有限数量元素的“安全”版本,请使用copy_if
:
void ReadFromFile(std::vector<double> &x, const std::string &file_name, unsigned int max_read)
{
std::ifstream read_file(file_name);
assert(read_file.is_open());
unsigned int cur = 0;
std::copy_if(std::istream_iterator<double>(read_file), std::istream_iterator<double>(),
std::back_inserter(x), [&](const double&) {
return (cur++ < max_read);
});
read_file.close();
}
用法很明显:
ReadFromFile(rx, Loadrx, max_numbers);
答案 1 :(得分:0)
尝试:
void ReadFromFile(const size_t N,
std::vector<double> &x,
const std::string &file_name)
{
std::ifstream read_file(file_name);
assert(read_file.is_open());
while (true)
{
double temp;
read_file >> temp; // read something
if(read_file.eof()) break; // exit when eof
x.push_back(temp);
if (N == x.size()) break; // exit when N elements
}
read_file.close();
}
int main()
{
size_t N = 10;
std::vector<double> v;
v.reserve(N);
ReadFromFile(v,"Data.txt");
}