2016-11-18 103 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"); 
}