Zliczanie i numerowanie poszczególnych linii w pliku .txt - pomocy!

0

Witam. Muszę napisać pracę zaliczeniową i stoję w miejscu - muszę zliczać i numerować poszczególne linie w celu ponumerowania książek. Nie wiem czemu, ale numerowanie wychodzi, z jednym malutkim wyjątkiem - program główny nie dopisuje do bliku .txt żadnej liczby. Podaję kod do wnikliwej analizy:

 
...
         fstream numerowanie("biblioteka.txt", ios::in | ios::out | ios::binary);
         {
                        for(l = 1; l <= licznik; l++)
                        {
                                      getline(numerowanie, line);
                                      cout << "L: " << l << endl;
                                      licznikTemp++;
                                      if(licznikTemp > 2)
                                      {
                                                  cout << "Licznik Temp: " << licznikTemp << endl;
                                                  numerkatalogowy = l / 4;
                                                  licznikTemp = 0;
                                                  numerowanie << numerkatalogowy << endl;
                                                  cout << "Numer: " << numerkatalogowy << endl;
                                       }
                         }
         numerowanie.close();
         }
...

Proszę o pomoc, dziękuję z góry :)

0

Zdajesz sobie sprawę że nie da się "dopisać" czegoś do pliku? Ty w ten sposób zamazujesz jedynie poprzednią treść dopisując tam jakieś liczby.

0

Znaczy się założenie z góry było skazane na niepowodzenie ?
A gdybym powiedział, że udało mi się to wykonać ? Nie działa, co prawda, to co stworzyłem w 100%, lecz jednak działa.
Oszukałem system ?

0

shalom trochę nie dopowiedział. Można to zrobić przez put(char)

0

Kolego, powiedz w jaki sposób ? Mógłbyś opisać dokładnie ?
Bo mój sposób nie jest do końca taki fajny - ucina litery, kopiuje początek pliku po kilka razy.
Bardzo wdzięczny byłbym.

0

No z tym ucinaniem liter też miałem problem, ponieważ zliczając same znaki, jakimś cudem nie udaje się dokładnie określić gdzie znajduje się wskaźnik w pliku .. trzeba troszkę kombinować :D

a mógłbyś pokazać, co masz aktualnie w kodzie?

0

Proszę bardzo :) Jeśli chce Ci się zerknąć na niego ;p

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    //deklaracje
    int wybor1, licznik, licznikTemp, l, numerkatalogowy, ilosc;
    string tytul, iautor, nautor, line;
    char rok[30];
    numerkatalogowy = 0;
    licznikTemp = 0;
    l = 0;
    ilosc = 0;
    
    
    do
    {
        licznik = 0;
        system("cls");
        cout << "Co chcesz zrobic?" << endl;
        cout << "1. Wyswietlic plik z ksiazkami do wypozyczenia" << endl;
        cout << "2. Wyswietlik plik z ksiazkami wypozyczonymi" << endl;
        cout << "3. Dodanie nowej ksiazki do zbioru" << endl;
        cout << "4. Wypozyczenie ksiazki" << endl;
        cout << "5. Przyjecie ksiazki" << endl;
        cout << "0. Wylaczenie programu" << endl;
        
        cin >> wybor1;     
        switch(wybor1)
        {
                      case 1:
                      {  
                             fstream bibliotekaO("biblioteka.txt");
                             if(!bibliotekaO) 
                             {
                                     cout << "Nie mozna otworzyc pliku.\n";
                             }
                             
                             char linelong[255];

                             while(bibliotekaO) 
                             {
                                       bibliotekaO.getline(linelong, 255);  
                                       if(bibliotekaO) cout << linelong << endl;
                             }
                             bibliotekaO.close();
                             
                             system("PAUSE");
                             break;
                      } 
                             
                      case 2:
                      {  
                             fstream wypozyczO("wypozyczone.txt");
                             if(!wypozyczO) 
                             {
                                     cout << "Nie mozna otworzyc pliku.\n";
                             }

                             char linelong[255];

                             while(wypozyczO) 
                             {
                                       wypozyczO.getline(linelong, 255);  
                                       if(wypozyczO) cout << linelong << endl;
                             }
                             wypozyczO.close();
                             system("PAUSE");
                             break;
                      }
                      case 3:
                      {
                             fstream dodaj("biblioteka.txt", ios::in | ios::out | ios::ate);
                             {
                                     if(!dodaj)
                                     {
                                               cout << "Nie mozna otworzyc pliku.\n";
                                               } else {
                                               cout << "Podaj imie autora ksiazki: ";
                                               cin >> iautor;
                                               cout << "Podaj nazwisko autora ksiazki: ";
                                               cin >> nautor;
                                               cout << "Podaj tytul ksiazki: ";
                                               cin >> tytul;
                                               cout << "Podaj rok wydania ksiazki: ";
                                               cin >> rok;
                                     }
                                     dodaj << endl;
                                     dodaj << "Tytul: " << tytul << endl;
                                     dodaj << "Autor: " << iautor << " " << nautor << endl;
                                     dodaj << "Rok wydania: " << rok << endl;
                                     dodaj.close();
                             }
                             
                             // liczenie linijek
                             fstream liczenie("biblioteka.txt", ios::in | ios::out);
                             {
                                     while (!liczenie.eof() )
                                     {
                                           getline(liczenie,line);
                                           licznik++;
                                     }
                                     cout << licznik << endl;
                                     ilosc = (licznik - 4) / 4;
                                     cout << ilosc << endl;
                                     liczenie.close();
                             }  
                             // koniec liczenia linijek
                               
                             //numerowanie ksiazek
                             fstream numerowanie("biblioteka.txt", ios::in | ios::out | ios::binary);
                             {
                                     if(numerowanie)
                                     {
                                     for(l = 1; l <= licznik; l++)
                                     {
                                           getline(numerowanie, line);
                                           cout << "L: " << l << endl;
                                           licznikTemp++;
                                           if(licznikTemp > 2)
                                           {
                                                          line = numerkatalogowy;
                                                          cout << "Licznik Temp: " << licznikTemp << endl;
                                                          numerkatalogowy = l / 4;
                                                          licznikTemp = 0;
                                                          numerowanie << line;
                                                          cout << "Numer: " << numerkatalogowy << endl;
                                           }
                                     }
                                     } else {};
                             numerowanie.close();
                             }
                             // koniec numerowania
         
                             
                                     
                             
                             
                             system("PAUSE");
                             break;
                      }
                                            
                                   
                           
                             
                             
         }
    }while(wybor1 != 0);
         
                  
                  




    system("PAUSE");
    return EXIT_SUCCESS;
}

 

~edit
Aktualnie nawet nie działa mi to dodawanie liczb, w szkole zrobiłem i działało, ale - tak jak wcześniej wspomniałem - ucinało znaki w pliku, więc postanowiłem zrobić na nowo.

0

Najłatwiej jest wczytać plik do stringa lub tablicy znaków, wykonać na nim wszystkie operacje jakie ma się do wykonania i zapisanie wszystkiego, czyszcząc wcześniej plik. Ew. wczytywanie danych blokami.

0

@up to jest jedyne poprawne rozwiązanie. Nie da się, jak już pisałem, nic do pliku dopisać w środku...

0

@Shalom
Postaram się odtworzyć to co stworzyłem dzisiaj na lekcji i Ci wkleję to w celu pokazania, że da radę dopisać coś do pliku, bo nie mogę patrzeć na to co piszesz.

@Blood
Mógłbyś trochę mnie nakierować bardziej, chociażby pseudokodem, abym wiedział co dalej robić ?

0

Na przykład:

  1. otwierasz plik
  2. wczytujesz cały plik do stringa i zamykasz plik.
  3. na pozycji 0 wstawiasz liczbę "1"
  4. przeszukujesz stringa do momentu osiągnięcia końca stringa:
    a) jeśli znajdziesz znak końca wiersza to wstaw liczbę
  5. Otwierasz plik czyszcząc go
  6. wpisujesz stringa
  7. zamykasz plik

taka pseudo lista kroków.

0

Zapytam od razu, przed kombinowaniem.
Do string'a wklei się cały plik czy trzeba dla każdej nowej linijki tworzyć nowego stringa?
W jaki sposób odbywa się czyszczenie pliku?

1

Do stringa wklejasz cały plik:

<code = cpp>ifstream plikDoCzytania("plik.txt");
char tekstZPliku[100000];
string zPliku = "";
plikDoCzytania.read(tekstZPliku,100000);
plikDoCzytania.close();
for(int j = 0; j < 100000; j++)
if(tekstZPliku[j] > 1 && tekstZPliku[j] < 123)
zPliku += tekstZPliku[j];


Z tym, że właśnie trzeba to zrobić przez tablicę znaków. Ta liczba 100000 to maksymalna ilość wczytywanych znaków z pliku, którą sam możesz ustawić. A czyszczenie pliku to po prostu otworzenie go w trybie nadpisywania, czyli:

<code = cpp>ofstream plikDoEdycji("plik.txt");
0
kszczygielski91 napisał(a)

@Shalom
Postaram się odtworzyć to co stworzyłem dzisiaj na lekcji i Ci wkleję to w celu pokazania, że da radę dopisać coś do pliku, bo nie mogę patrzeć na to co piszesz.

Nie da się dopisać czegoś w środku pliku, najwyżej można nadpisać jakieś znaki w środku albo dopisać coś do końca pliku.

0

@kszczygielski91 czekam z niecierpliwością, bo może coś się zmieniło od kiedy ostatni raz korzystałem z plików... :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1