logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Porównanie plików tekstowych w C++ i zapis różnic do nowego pliku

faziix 01 Lip 2006 18:46 5157 5
  • #1 2781347
    faziix
    Poziom 12  
    Posty: 92
    Pomógł: 3
    Ocena: 8
    Witam. Mam nastepujacy problem. Wezmy pod uwage plik tekstowy zajmujacy jakies 30 MB i zawierajacy kilkaset tysiecy lini tekstu. Pozniej do tego pliku dokladamy jeszcze np 10 lini :) I teraz chodzi mi o program ktory porowna mi linia po lini te dwa pliki i rózniace sie wersy zapisze do trzeciego pliku :) jakby ktos mogł podac tu kodzik zrodłowy ( zbyt długi to on chyba nie bedzie) to byłbym wdzieczny. Pozdrawiam :)
  • #2 2782777
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 43
    faziix napisał:
    Witam. Mam nastepujacy problem. Wezmy pod uwage plik tekstowy zajmujacy jakies 30 MB i zawierajacy kilkaset tysiecy lini tekstu. Pozniej do tego pliku dokladamy jeszcze np 10 lini :) I teraz chodzi mi o program ktory porowna mi linia po lini te dwa pliki i rózniace sie wersy zapisze do trzeciego pliku :) jakby ktos mogł podac tu kodzik zrodłowy ( zbyt długi to on chyba nie bedzie) to byłbym wdzieczny. Pozdrawiam :)

    Czy te linie dołączamy na koniec pliku, czy zmieniamy dowolne linie pliku?
  • #3 2785031
    faziix
    Poziom 12  
    Posty: 92
    Pomógł: 3
    Ocena: 8
    Nie no np taka sytuacja plik1.txt : 1 2 4 6 7 8 plik2.txt (po dodaniu lini) 1 2 3 4 5 6 7 8 ,czyli najlepiej program pobiera pod dwie zmienne zawsze pierwszy wers z kazdego pliku i porownuje . Jezeli wartosci zmiennych takie same to te linie usuwa. Jezeli rozne to usuwa dana linie z drugiego pliku i zapisuje do pliku wynikowego. W konsekwencji chce uzyskac dwa puste pliki i trzeci z ta rozniaca sie zawartoscia. W sumie juz wiem jak to zrobic ale nie bardzo wiem jak podstawic pod zmienna wiersz o nr 1. Kombinowalem cos z pobieraniem poszczegolnych znakow i laczeniu ich az do napotkania znaku przejscia do nowej lini o kodzie #13 - enter ale cos mi nie wychodzi :/
  • #5 2786559
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 43
    nie wiem czy dobrze się rozumiemy. Jeżeli zawartość 1 pliku będzie
    1;2;4;6;
    a 2 pliku:
    1;2;3;4;6
    to zawartość wynikowego może wynosić:
    3;4;6;
    ale przy innej interpretacji może być: 3;
    bo mimo że do 2 pliku dodano w środku linię o zawarości 3,to 4=4;6=6
    Czyli jak ma być?
  • Pomocny post
    #6 2799008
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 43
    faziix napisał:
    Witam. Mam nastepujacy problem. Wezmy pod uwage plik tekstowy zajmujacy jakies 30 MB i zawierajacy kilkaset tysiecy lini tekstu. Pozniej do tego pliku dokladamy jeszcze np 10 lini :) I teraz chodzi mi o program ktory porowna mi linia po lini te dwa pliki i rózniace sie wersy zapisze do trzeciego pliku :) jakby ktos mogł podac tu kodzik zrodłowy ( zbyt długi to on chyba nie bedzie) to byłbym wdzieczny. Pozdrawiam :)

    Prawdę mówiąc nie widziałem pliku tekstowego 30Mb,ale widocznie mało widziałem. Dołączam kod programu wykorzystuje dwa kontenery set.
    Jeżeli pliki będą >>>> to prog. będzie musiał korzystać z pliku wymiany i wykonanie trochę potrwa.
    Dodaję że dodane linie mogą być w pliku dowolnie położone np:
    plik I 1;2;3;4
    plik II 0;00;1;5;2;6;3;4;7

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <iterator>
    #include <conio.h>
    using namespace std;

    char cc1[50],cc2[50],cc3[50];
    char c;
    int nr=0;
    int nr1=0;
    int nr2=0;
    string st,line;
    vector <string> v1;
    vector <string> v2;
    int main()
    {
    st="";
    cout<<"podaj sciezke do mniejszego pliku ";cin>>cc1;
    cout<<"podaj sciezke do wiekszego (dopisanego) pliku ";cin>>cc2;
    cout<<"podaj sciezke do pliku wynikowego ";cin>>cc3;
    ofstream out_plik;
    out_plik.open (cc3, ofstream::out);
    ifstream odcz1;
    ifstream odcz2;
    odcz1.open (cc1, ifstream::in);

    while(!odcz1.eof())
    {
    nr1++;
    odcz1.getline(cc1,50);
    v1.push_back(cc1);
    v1.push_back("\n");
    }
    odcz1.close();

    odcz2.open (cc2, ifstream::in);
    while(!odcz2.eof())
    {
    nr2++;
    odcz2.getline(cc2,50);
    v2.push_back(cc2);
    v2.push_back("\n");
    }
    odcz2.close();
    vector<string>::iterator it;

    powt: {
    cout<<"czekaj...";
    if(v1.size()==v2.size()){out_plik.close(); exit(0);}
    if(v1[nr]!=v2[nr])
    {out_plik<< v2[nr];
    it=v2.begin()+nr;
    v2.erase(it);
    nr=0;
    } else
    {nr++;goto powt;}
    }
    if(nr<nr1-1) goto powt;

    getch();
    }
REKLAMA