2016-05-15 15 views
0

Ich möchte mehrere Dateien Adressen vom Benutzer erhalten dann lesen und schreiben sie als der binäre Modus in einer struct.txt-Datei und in anderen Programm-Export-Dateien aus der Datei struct.txt. Bitte führen Sie mich. Importing - mergeexporting - unmergelesen schreiben mehrere Dateien in C++

#include <iostream> 
#include <string> 
#include <fstream> 
#include <iterator> 
#include <algorithm> 
using namespace std; 
int tedad_file=0; // get count of files from user // 

int main() 
{ 
    int tr=0; 
    cout << "please enter count of files you want to merge "; 
    cin >> tedad_file; 
    cout << "\n"; 
    std::string *files[tedad_file]; 
    int counter=0; 
    int temp=0; 
    for(;temp<tedad_file;temp++) // getting file's address from user and add them into arrays of string (files variable) 
    { 
     cout << "Lotfan address file " << temp + 1 << " vared konid: \n"; 
     cin >> *files[temp]; 
    } 

    std::ofstream output_file("D:\\struct.txt", std::ios::binary) ; 
    int x=0; 
    for(;x<tedad_file;x++) // for - read content of files to merge them into struct.txt ---- for example tedad_file is 3 
    { 
     std::ifstream first_file((char *)&files[tedad_file], std::ios::binary) ; 
     output_file << first_file.rdbuf(); 
    } 
    return 0; 
} 

Antwort

1

Sie sollten std::vector<std::string> files und files.push_back(filename) Zum Beispiel verwenden:

int main() 
{ 
    std::vector<std::string> files; 

    cout << "please enter count of files you want to merge "; 
    int file_count = 0; 
    cin >> file_count; 

    for (int temp = 0; temp<file_count; temp++) 
    { 
     cout << "Lotfan address file " << " vared konid: \n"; 
     std::string filename; 
     cin >> filename; 
     files.push_back(filename); 
    } 

    std::ofstream output_file("D:\\struct.txt", std::ios::binary); 
    for (auto file : files) 
    { 
     std::ifstream fin(file, std::ios::binary); 
     output_file << fin.rdbuf(); 
    } 

    return 0; 
} 

Andernfalls den new Operator verwenden. Aber new Methode ist anfällig für Fehler. Zum Beispiel:

int main() 
{ 
    cout << "please enter count of files you want to merge "; 
    int tedad_file = 0; 
    cin >> tedad_file; 
    cout << "\n"; 

    std::string *files = new std::string[tedad_file]; 
    for (int temp = 0; temp<tedad_file; temp++) 
    { 
     cout << "Lotfan address file " << " vared konid: \n"; 
     cin >> files[temp]; 
    } 

    std::ofstream output_file("D:\\struct.txt", std::ios::binary); 
    for (int temp = 0; temp<tedad_file; temp++) 
    { 
     std::ifstream first_file(files[temp], std::ios::binary); 
     output_file << first_file.rdbuf(); 
    } 

    delete[]files; 
    return 0; 
} 
+0

Ich kann nicht verstehen Sie es in Code zeigen könnte? Vielen Dank –

1

Warum haben Sie diese Zeile schreiben: std::string *files[tedad_file];? Sie müssen zuerst Speicher für diesen Zeiger reservieren. Es wäre viel besser, wenn Sie hier einfach keine Zeiger verwenden würden und etwas wie: std::string files[tedad_file]. Ihr Code hat Speicher für die Zeichenfolgen in dem Array nicht reserviert, und das ist der Grund, warum es einen Segfault gibt.

0

auf diese Weise gelöst

int tedad_file=0; // Daryaft tedad file jahate edgham // 

int main() 
{ 
int tr=0; 
cout << "Lotfan Tedad file jahate edgham vared konid: "; 
cin >> tedad_file; 
cout << "\n"; 
std::string files[tedad_file]; 
int counter=0; 
int temp=0; 
for(;temp<tedad_file;temp++) 
{ 
cout << "Lotfan address file " << temp + 1 << " vared konid: \n"; 
cin >> files[temp]; 
} 
streampos size1; 
std::ofstream output_file("D:\\test.txt", std::ios::binary) ; 
int x=0; 
string dd; 
for(;x<tedad_file;x++) 
{ 
dd = files[x]; 
std::ifstream first_file(dd.c_str(), std::ios::binary) ; 
output_file << first_file.rdbuf(); 
size1 = first_file.tellg(); 
cout << size1; 
} 

return 0; 
}