2016-11-18 12 views
0

ファイルからベクトルへの未知数のデータ(列の場合)を読み込む関数を記述しました。ファイルからベクトルC++への関数の読み込み

ただし、ファイルからのデータがベクターにコピーされた後、lineCountが1つ増えています。私が書いたif文よりも問題を解決するためのよりエレガントな方法がありますか?

編集:明らかに、私はデータファイルをアップロードしません。コードは完全にコンパイルされています。if文がある場合は、if文の改良点を探しています。

+0

使用のgetline()の代わりに。 –

+0

@Mattあなたは何について話していますか?コードはVS15で正常にコンパイルされます – nikjohn

+0

x.at(linecount)の代わりにx.push_back()を使用し、Nを直接ReadFromFileに渡し、vを作成しますが空のままにしてN個の要素を予約します。 –

答えて

2

私は、ファイルからのベクトルにデータの不明数(とき列内)を読み取る機能を書かれています。

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

最もエレガントなの一つ「列」からのデータの未知の量を読み込む方法(またはそれ以外の場合は、定期的にフォーマット)ファイル(と、私は、慣用を想定)はistreamイテレータを使用することです

使用法:あなたが読むための要素の数が限られている「安全な」バージョンを書きたい場合は

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"); 
} 
関連する問題