Lista dwukierunkowa - odczyt i zapis do pliku

0

Witam.

Zaczynam z C++ i chcę zrobić coś takiego: Lista dwukierunkowa - dane wczytujemy z pliku, następnie dokonujemy operacji na tych danych - np. usunięcie ogona listy, wyszukiwanie po indeksie itd. Na koniec tak zmodyfikowane dane zapisujemy do innego pliku.

Na razie napisałam mam kod, który wczytuje dane z pliku (jako string) i zapisuje je do kolejnego pliku.

#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    string wiersze; // przechowuje odczytane wiersze tekstu
 
    fstream plik("ścieżka\\wejscie.txt", ios::in);
    fstream zapis("ścieżka\\wyjscie.txt", ios::out | ios::app);
 
    if (plik.good() == true) // jeśli plik uda się otworzyć - następuje odczyt danych z pliku
    {
        while (getline(plik, wiersze)) // jesli nie natrafi na koniec pliku, czyta kolejny wiersz
        {
            cout << wiersze << endl; // wypisuje odczytane wiersze w konsoli + tutaj dalej kod do np. operacji na listach
            zapis << wiersze << endl; // zapisuje odczytane wartosci do pliku
        }
        plik.close(); //zamyka plik po odczytaniu
        zapis.close();
    }
    else // jesli nie uda sie otworzyc pliku do odczytu
    {
            cout << "Nie mozna otworzyc pliku" << endl;
    }
    return 0;
}

I mam takie pytanie. Jak zacząć teraz pracować na liście dwukierunkowej? Rozumiem, że należy zadeklarować strukturę ze wskazaniem na *next i *prev, ale nie wiem jak operować na tej zmiennej "wiersze", do której zapisane zostały dane.

Czy to może być coś takiego?

struct strukturaDanychDeklaracja{
    strukturaDanychDeklaracja *next;
    strukturaDanychDeklaracja *prev;
    int key;
};
 
strukturaDanychDeklaracja* wiersze;
0

Nie, nie może. Zazwyczaj kontenery takie jakie list udostępniają metody do dodawania i usuwania elementów. Ponadto dlaczego w tej strukturze masz typ int, skoro chcesz przechowywać dane typu std::string?

I w ogóle, po co chcesz implementować tą listę? Kontener std::list jest nie wystarczający?

0

Chcę zrozumieć operowanie na wskaźnikach i dlatego nie chcę używać std::list
Jak mogę zacząć deklarować tą listę? Mogę prosić o taki przykładowy szkielet?

1

Zapis listy do pliku w zasadzie nie ma nic wspólnego z tym, że dane są zorganizowane w postaci listy.
Po prostu masz jakaś sekwencję danych, które zapisujesz do pliku, a potem tą sekwencję wczytujesz. To czy to jest: lista jedno lub dwu kierunkowa, czy może zwykła tablica, ma drugorzędne znaczenie.
Jeśli poprawnie zaimplementujesz dodawanie elementów do listy i chodzie po kolejnych elementach listy, powinno pozwalać na napisanie zapisu oraz odczytu.

Przykładowo w STL może wyglądać to tak (C++03):

class ZapiszDoPliku
{
public:
    ZapiszDoPliku(std::ostream &out): output(out) {}

    void operator()(const std::string& s)
    {
         output << s << 'n';
    }

private:
   std::ostream &output;
};

std::list<std::string> dane; // albo std::vector<std::string> dane; ta zmiana nie powoduje, że kod zapisu się zmienia.
… … // generowanie danych

ofstream zapis("path/wyjscie.txt");
if (zapis.good())
{
    std::for_each(dane.begin(), dane.end(), ZapiszDoPliku(zapis));
}

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