2017-10-17 99 views
1

我有下面的代碼(從here mookhed)隨機化1500個值的向量,我想將它們放在一個文本文件,但不能。老實說,我不完全理解這段代碼是如何工作的,所以我希望有人向我解釋它是如何工作的和/或如何將輸出更改爲文件。如何使用ostream_iterator打印到文件?

#include <iostream> 
#include <random> 
#include <algorithm> 
#include <iterator> 
#include <fstream> 

int main() { 
    std::vector<int> v; 
    for (int i; i<1500; ++i){ 
     v.push_back(i); 
    } 

    std::random_device rd; 
    std::mt19937 g(rd()); 

    std::shuffle(v.begin(), v.end(), g); 

    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << "\n"; 

    return 0; 
} 
+3

'的std :: ostream_iteartor '是一個迭代返回一個對象來自'operator *()',它在賦值時寫入一個流,然後是字符串分隔符。 std :: copy()將源序列的每個元素分配給目標序列中的一個對象,即每個對象都寫入流中。只需用'std :: ofstream'的一個對象替換'std :: cout'來打開目標文件即可。 –

回答

2

類型的std::cout和類型std::ofstream都由std::ostream衍生,這是相同的類型std::ostream_iterator上操作:

#include <iostream> 
#include <random> 
#include <algorithm> 
#include <iterator> 
#include <fstream> 

void emit_values(std::ostream& os) 
{ 
    std::vector<int> v; 
    for (int i = 0; i<1500; ++i){ 
     v.push_back(i); 
    } 

    std::random_device rd; 
    std::mt19937 g(rd()); 

    std::shuffle(v.begin(), v.end(), g); 

    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(os, " ")); 
    os << "\n"; 
} 

int main() 
{ 
    // use stdout 
    emit_values(std::cout); 

    // use a file 
    std::ofstream fs("values.txt"); 
    emit_values(fs); 
    fs.close();  

    return 0; 
}