2015-06-15 124 views
0

假設我有兩個文件需要讀取。我怎樣才能將每個文件的文件內容同時寫入另一個文件?目前,我正在將每個文件的內容讀入一個向量中,並在讀取部分放置鎖,但是當我在寫入過程中執行類似操作時,我只能看到來自輸出文件中某個文件的內容。如何同時寫入單個文件?

我正在用g ++ -std = C++ 11 -pthread program_name編譯。任何意見或批評歡迎。

#include <iostream> 
#include <thread> 
#include <string> 
#include <mutex> 
#include <vector> 

void read(const char *file); 
void write(const vector<string> &v); 

void read(const char *file) { 
    string line; 
    vector<string> v; 
    ifstream in(file); 

    m.lock(); 
    while(getline(in, line)) { 
     v.push_back(line); 
    } 
    in.close(); 
    m.unlock(); 

    write(v); 
} 

void write(const vector<string> &v) { 
    ofstream out("Foo"); 
    vector<string>::const_iterator it; 
    m.lock(); 
    for(it = v.begin(), it != v.end(); ++it) { 
     out << *it << endl; 
    } 
    out.close(); 
    m.unlock(); 
} 

int main(int argc, char *argv[]) { 
    thread t[2]; 
    for(int i = 1; i < 3; i++) { 
     t[i-1] = thread(read, argv[i]); 
    } 

    for(int k = 0; k < 2; k++) { 
     t[i].join(); 
    } 

    return(0); 
} 
+2

您首先合併矢量,然後寫出結果的輸出。 –

+1

您正在閱讀2個文件。你正在寫一封信。每位作家打開文件,並從頭開始寫作。請注意,'ofstream out(「Foo」)'寫入文件,並且不受互斥體的保護。鎖定它,並確保你處於追加模式。 – Yakk

+0

@Yakk完美。是的,這是問題所在。另外,不知道追加模式。感謝那。 – ChrisD

回答

1

您應該通過模式(第二個參數),以 (http://www.cplusplus.com/reference/fstream/ofstream/ofstream/) 的ofstream出來( 「富」,的std :: ofstream的應用::)

否則文件被覆蓋的ofstream的構造,每次你打電話寫信。

併發性是一個不同的問題。如果您的問題由固有順序的部分組成,那麼併發就沒有多大意義。