2015-06-15 82 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的构造,每次你打电话写信。

并发性是一个不同的问题。如果您的问题由固有顺序的部分组成,那么并发就没有多大意义。