2016-11-18 71 views
0

我已经写了一个函数,用于从文件读取未知数量的数据(当在一列中)到一个向量。函数从文件读入向量C++

#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

使用函数getline()来代替。 –

+0

@Matt你在说什么?代码在VS15中编译得很好 – nikjohn

+0

使用x.push_back()而不是x.at(linecount),将N direct传递给ReadFromFile,构造v但留空,并保留N个元素。 –

回答

2

我已经写一个函数,读取未知数目的数据(在一列时)从一个文件到一个载体中。

其中最优雅的(和,我想,惯用语)的方式从“列”读取数据的未知量(或以其他方式定期格式)文件是使用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); 
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"); 
}