Jednoczesne odczytywanie i zapisywanie do pliku.

0

Witam. Potrzebuję napisać funkcję, która usuwa coś z pliku. Jest to można powiedzieć taka "baza" studentów. Struktura pliku wygląda tak:

<indeks studenta="studenta"> <imie> <nazwisko> <e-mail> <indeks kolejnego="kolejnego"> itd.

Próbuję wczytywać dane z pliku i po napotkaniu danego nazwiska, pomijać ten rekord przy wpisywaniu. Sprawa byłaby prostsza, gdybym mógł wczytać cały plik do jakiegoś bufora, ale niestety tego zrobić nie mogę. Kod wygląda tak:

 a.open("studenci.txt", fstream::out | fstream::in);
     int indeks;
     int licznik=0;
     string nazwisko,plik_nazwisko,imie,mail;
     cout << "\tUSUN STUDENTA" << endl;
     cout << "*----------------------*" << endl<<endl;
     cout << "Podaj nazwisko studenta, ktorego chcesz usunac: ";
     cin >> nazwisko;

     while(!a.eof()) {

            a >> indeks;
            a >> imie;
            a >> plik_nazwisko;
            a >> mail;
            system("PAUSE");
            if (nazwisko!=plik_nazwisko) {
                   a << "\n\n" << indeks << "\n" << imie << "\n" << plik_nazwisko << "\n" << mail;
            } else {
                   licznik++;
            }                
     }
     cout <<endl<<"Usunieto "<<licznik<<" studentow z bazy..."<<endl;
     a.clear();
     a.close();
     system("PAUSE");

Próbowałem ogólnie jakoś manewrować seekg,seekp, ale nie bardzo to pomaga. While po prostu trwa w nieskończoność. Z góry dziękuję za za pomoc i przepraszam za trochę chaotyczną formę pytania, ale mam nadzieję, że zrozumiecie.

0

Zapisuj do innego pliku. Po zakończeniu zapisu:

  • unlink
  • rename
0

I raczej nie ma innego rozwiązania ? Bo rozważałem to, ale zapomniałem że mogę przecież usunąć plik z poziomu programu, a także zmienić nazwę. W takim razie dzięki za pomoc. Wydawało mi się, że jakoś da się fstreamem jednocześnie odczytywać i zapisywać, ale pewnie jest z tym trochę zabawy.

0

Jeżeli funkcje nie działają to jedno z:

  1. nie zamknąłeś pliku
  2. gdzie indziej jest otwarty
  3. brak odpowiednich uprawnien
0

A co jeżeli wszystkie z wymienionych przez Ciebie podpunktów są spełnione ? Nie mam błędu typu permission denied, pliki zamykam przed użyciem tych funkcji i nie są wcześniej nigdzie otwierane.

0

Rozumiem ze masz bana na googlach?

if(remove("myfile.txt")) cout<<"Nie da sie usunac: "<<strerror(errno)<<endl;
if(rename("tmpfile.txt","myfile.txt")) cout<<"Nie da sie przemianować: "<<strerror(errno)<<endl;
0

Niestety, w mojej części Polski nie ma dostępu do tej wyszukiwarki. Hehe... W każdym razie rozwiązałem problem, jakimś cudem wszystkie 3 pliki były otwarte w windowsowym cmd, po ręcznym zamknięciu procesów już wszystko śmiga, dzięki za pomoc.

0
virtas napisał(a):

Niestety, w mojej części Polski nie ma dostępu do tej wyszukiwarki ...
Chiny nie są częścią Polski.

0

To już był dla mnie za ciężki żart, przepraszam. Jeszcze raz dzięki.

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