Znalazem w pewnej hiszpanskiej e-ksiazce kod pewnego programu w Pascalu
uses crt;
type tArchivo=text;
tComponente=string;
procedure LeerElemDetectandoFin(var arch:tArchivo;var comp:tComponente;var finArch:boolean);
begin
finArch:=eof(arch);
if not finArch then
readln(arch,comp);
end;
procedure PasarElemDetectandoFin(var archOrigen,archDestino:tArchivo;var comp:tComponente;var finArchOrigen:boolean);
begin
writeln(archDestino,comp);
LeerElemDetectandoFin(archOrigen,comp,finArchOrigen)
end;
procedure Mezcla(var aux1,aux2,arch:tArchivo);
var c1,c2:tComponente;
finArch1,finArch2:boolean;
begin
Reset(aux1);
Reset(aux2);
Rewrite(arch);
LeerElemDetectandoFin(aux1,c1,finArch1);
LeerElemDetectandoFin(aux2,c2,finArch2);
while not finArch1 and not finArch2 do
if(c1<c2)then
PasarElemDetectandoFin(aux1,arch,c1,finArch1)
else
PasarElemDetectandoFin(aux2,arch,c2,finArch2);
while not finArch1 do
PasarElemDetectandoFin(aux1,arch,c1,finArch1);
while not finArch2 do
PasarElemDetectandoFin(aux2,arch,c2,finArch2);
Close(arch);
Close(aux1);
Close(aux2)
end;
procedure Division(var arch,aux1,aux2:tArchivo;var esVacio2:boolean);
var valorActual,valorAnterior:tComponente;
cambio:boolean;
begin
Reset(arch);
Rewrite(aux1);
Rewrite(aux2);
cambio:=True;
esVacio2:=True;
if not eof(arch)then
begin
Readln(arch,valorActual);
Writeln(aux1,valorActual);
valorAnterior:=valorActual
end;
while not eof(arch)do
begin
Readln(arch,valorActual);
if(valorAnterior>valorActual)then
cambio:=not cambio;
if cambio then
Writeln(aux1,valorActual)
else
begin
Writeln(aux2,valorActual);
esVacio2:=False;
end;
valorAnterior:=valorActual
end;
Close(arch);
Close(aux1);
Close(aux2)
end;
var arch,aux1,aux2:tArchivo;
ruta,ruta1,ruta2:string;
esVacio2:boolean;
begin
clrscr;
writeln('Darme ruta de archivo que quieres ordenar');
readln(ruta);
ruta1:=copy(ruta,1,pos('.',ruta)-1)+'_temp001.txt';
ruta2:=copy(ruta,1,pos('.',ruta)-1)+'_temp002.txt';
assign(arch,ruta);
assign(aux1,ruta1);
assign(aux2,ruta2);
esVacio2:=False;
while not esVacio2 do
begin
Division(arch,aux1,aux2,esVacio2);
if not esVacio2 then
Mezcla(aux1,aux2,arch);
end;
end.
Probowalem przepisac ten kod na C++ w ten sposob
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void LeerElemDetectandoFin(fstream &arch,string &comp,bool &finArch)
{
finArch=arch.eof();
if(!finArch)
{
getline(arch,comp);
}
}
void PasarElemDetectandoFin(fstream &archOrigen,fstream &archDestino, string &comp,bool &finArchOrigen)
{
archDestino<<comp<<"\n";
LeerElemDetectandoFin(archOrigen,comp,finArchOrigen);
}
void Mezcla(string ruta,fstream &aux1,fstream &aux2,fstream &arch)
{
string c1,c2;
string ruta1,ruta2;
bool finArch1,finArch2;
size_t posicion;
posicion=ruta.find(".");
if(posicion!=string::npos)
{
ruta1=ruta.substr(0,posicion)+"_temp001.txt";
ruta2=ruta.substr(0,posicion)+"_temp002.txt";
}
aux1.open(ruta1.c_str(),ios::in);
aux2.open(ruta2.c_str(),ios::in);
arch.open(ruta.c_str(),ios::out);
LeerElemDetectandoFin(aux1,c1,finArch1);
LeerElemDetectandoFin(aux2,c2,finArch2);
while(!finArch1 && !finArch2)
if(c1<c2)
PasarElemDetectandoFin(aux1,arch,c1,finArch1);
else
PasarElemDetectandoFin(aux2,arch,c2,finArch2);
while(!finArch1)
PasarElemDetectandoFin(aux1,arch,c1,finArch1);
while(!finArch2)
PasarElemDetectandoFin(aux2,arch,c2,finArch2);
arch.close();
aux1.close();
aux2.close();
}
void Division(string ruta,fstream &arch, fstream &aux1,fstream &aux2,bool &esVacio2)
{
string valorActual,valorAnterior;
string ruta1,ruta2;
bool cambio;
size_t posicion;
posicion=ruta.find(".");
if(posicion!=string::npos)
{
ruta1=ruta.substr(0,posicion)+"_temp001.txt";
ruta2=ruta.substr(0,posicion)+"_temp002.txt";
}
arch.open(ruta.c_str(),ios::in);
aux1.open(ruta1.c_str(),ios::out);
aux2.open(ruta2.c_str(),ios::out);
cambio=true;
esVacio2=true;
if(!arch.eof())
{
getline(arch,valorActual);
aux1<<valorActual<<"\n";
valorAnterior=valorActual;
}
while(!arch.eof())
{
getline(arch,valorActual);
if(valorAnterior>valorActual)
cambio=!cambio;
if(cambio)
aux1<<valorActual<<"\n";
else
{
aux2<<valorActual<<"\n";
esVacio2=false;
}
valorAnterior=valorActual;
}
arch.close();
aux1.close();
aux2.close();
}
int main()
{
string ruta;
bool esVacio2=false;
fstream arch,aux1,aux2;
cout<<"Darme ruta de archivo que quieres ordenar\n";
getline(cin,ruta);
while(!esVacio2)
{
Division(ruta,arch,aux1,aux2,esVacio2);
if(!esVacio2)
{
Mezcla(ruta,aux1,aux2,arch);
}
}
}
Jednak zamiast dzialac tak jak ten kod Pascalowy tworzy puste pliki
Procedury Pascalowe zamieniamy na funkcje typu void
Parametry procedur poprzedzone slowkiem var w C++ przekazujemy przez referencje
W Pascalu mamy osobna procedure do zwiazywania zmiennej plikowej z plikiem
oraz do otwierania pliku , w C++ mamy tylko funkcje otwierajaca plik wiec dodalem jeszcze dodatkowy parametr funkcji
Ciekaw jestem dlaczego kod w C++ nie dziala tak jak ten Pascalowy
Slowniczek
LeerElemDetectandoFin czytac element wykrywajac koniec
arch skrot od archivo czyli plik
comp skrot od componente czyli skladowa
finArch koniec pliku
PasarElemDetectandoFin
Gdyby chcial to tlumaczyc to pewnie wyszloby cos takiego przejsc przez element wykrywajac koniec poniewaz pisac to u nich escribir
ArchOrigen plik zrodlowy
ArchDestino plik docelowy
finArchOrigen koniec pliku zrodlowego
Mezcla tutaj scalanie
ruta sciezka
aux1 pierwszy plik pomocniczy
aux2 drugi plik pomocniczy
posicion pozycja
Division dzielenie
esVacio2 czy drugi (plik pomocniczy) jest pusty
valorActual wartosc aktualna
valorAnterior wartosc poprzednia
cambio zamiana