2017-11-27 1 views
-1
#include<iostream> 
#include<fstream> 
using namespace std; 
int main() 
{ 
fstream file1,file2,file3,file4; 
int num1,num2,num,temp=0,a[20]; 
file1.open("source1.txt",ios::in); 
file2.open("source2.txt",ios::in); 
file3.open("sample.txt",ios::out|ios::in|ios::trunc); 
file4.open("target.txt",ios::out|ios::in|ios::trunc); 
if(file1.is_open()&&file2.is_open()&&file3.is_open()&&file4.is_open()) 
{ 

while(file1) 
{ 
    file1>>num1; 
    file3<<num1<<'\n'; 
} 
file1.close(); 
while(file2) 
    { 
    file2>>num2; 
    file3<<num2<<'\n'; 
    } 
    file2.close(); 

    file3.seekg(0); 
    int i=0; 
    while(file3) 
    { 
    file3>>num; 
    a[i]=num; 
     i++; 
    } 

    for(int j=0;j<i-1;j++) 
    { 
    if(a[j]<a[j+1]) 
    { 
     temp=a[j+1]; 
     a[j+1]=a[j]; 
     a[j]=temp; 
    } 
    } 
    file3.close(); 
    for(int j=0;j<i;j++) 
    file4<<a[j]<<'\n'; 
    file4.close(); 
    } 
    else 
    cerr<<"\nError!"; 
    return 0; 
    } 

source1 und source 2 enthält Ganzzahlen, die in das Ziel kopiert werden müssen, und sie sollten sortiert werden. Ich kann sie nicht mit dem obigen Code sortieren. Außerdem sehe ich, dass die letzte Ganzzahl von Quelle1 und Quelle2 zweimal kopiert wird.Erstellen einer Datei sortierter Ganzzahlen aus zwei anderen Dateien

+0

'file1 >> num1' etc können an der Ausfall Ende der Datei, also Schleife mit 'while (Datei1 >> Nummer1)', usw. Dies verhindert, dass die letzte ganze Zahl dupliziert wird. Als nächstes benötigt Ihre Sortierroutine verschachtelte Schleifen, nicht nur eine einzelne Schleife. Schließlich benötigen Sie nicht das Zwischenprodukt 'file3'. –

+0

@ KenY-N was ist der Unterschied, wenn ich verschachtelte Schleifen verwende? Ich habe versucht, eine einzelne Schleife für ein nicht-Datei-bezogenes Programm zu verwenden, und es hat funktioniert. –

+0

Für grundlegende Sortieralgorithmen wie Einfügesortierung, Blasensortierung usw. benötigen Sie verschachtelte Schleifen. Sie können nicht in einem einzigen Durchgang sortieren. –

Antwort

0

können Sie versuchen, abwechselnd das Lesen von entweder Datei, auf dem je zuvor die kleinere Zahl hatte:

file1 >> num1; 
file2 >> num2; 
while(file1 || file2) 
{ 
    if (!file2) 
    { 
    file3 << num1 << "\n"; 
    file1 >> num1; 
    } 
    else if (!file1) 
    { 
    file3 << num2 << "\n"; 
    file2 >> num2; 
    } 
    else if (num1 < num2) 
    { 
    file3 << num1 << "\n"; 
    file1 >> num1; 
    } 
    else 
    { 
    file3 << num2 << "\n"; 
    file2 >> num2; 
    } 

} 
+1

Sind Sie sicher, dass 'Datei1' und' Datei2' bereits sortiert sind? Die Spezifikation ist dazu nicht klar. –

+0

Ich interpretierte das als die Bedeutung dieses Satzes: "source1 und source 2 enthält Ganzzahlen, die auf Ziel kopiert werden müssen und sie sollten sortiert werden.", Aber es ist möglich, dass sie etwas anderes meinten – idontseethepoint

+0

@idontseethepoint Dies funktioniert nicht . Gibt es einen Aliter? –

2

Wenn Sie möglich, Sie in der Regel die Algorithmen in der Standard-Bibliothek gebaut verwenden möchten, so (zum Beispiel) Um die Sortierung durchzuführen, können Sie std::sort verwenden.

std::ifstream in1("source1.txt"); 
std::ifstream in2("source2.txt"); 

std::vector<int> numbers; 

std::copy(std::istream_iterator<int>(in1), {}, std::back_inserter(numbers)); 
std::copy(std::istream_iterator<int>(in2), {}, std::back_inserter(numbers)); 

std::sort(numbers.begin(), numbers.end()); 

std::ofstream out("target.txt"); 

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

Wenn die Zahlen in jeder Eingabedatei sortiert werden, so dass Sie nur zwei sortierte Ströme fusionieren müssen, könnten Sie std::merge statt:

std::ifstream in1("source1.txt"); 
std::ifstream in2("source2.txt"); 
std::ofstream out("target.txt"); 

std::merge(std::istream_iterator<int>(in1), {}, 
      std::istream_iterator<int>(in2), {}, 
      std::ostream_iterator<int>(out, "\n")); 
Verwandte Themen