Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kasowanie wybranego wiersza w pliku txt

Ostatnio zmodyfikowano 2011-06-02 20:22
Autor Wiadomość
kamilo
Temat założony przez niniejszego użytkownika
Kasowanie wybranego wiersza w pliku txt
» 2011-06-02 17:46:39
Witam,
Mam nie mały problem z napisaniem kodu który kasowałby mi wybrany wiersz w pliku. Tzn. kod napisałem jednak nie zupełnie działa.
Do rzeczy..
Treść funkcji realizującej powyższe zadanie:

C/C++
void kasuj()
{
    int numer, i;
    fstream kasuj;
    kasuj.open( "dane.txt", ios::in | ios::out );
    if( kasuj.good() )
    {
        string wiersz, napis;
        cout << "Kasuj ksiazke\n";
        cout << "Podaj nr wiersza ksiazki do skasowania: ";
        i = 1;
       
        cin >> numer;
        cin.ignore();
       
        while( !kasuj.eof() )
        {
            getline( kasuj, wiersz );
            if( i != numer )
            {
                napis = wiersz;
                cout << napis << endl;
                //kasuj<<napis<<endl;       
            }
            i++;
        }
        kasuj.close();
    }
    else cout << "Error! Nie udalo otworzyc sie pliku!" << endl;
   
}
Teraz o co mi dokładnie chodzi... Funkcja działa poprawnie gdy wyświetlam już zawartość pliku (ze skasowanym wierszem) na ekranie jednak problem jest gdy chcę przepisać cały plik już bez tego usuniętego wiersza.. Funkcja zachowuje się jakoś dziwnie, zapętla się... Gdzie leży problem ? Ja już  nie mam pomysłów.. szukałem w google ale nie spotkałem się z takim przypadkiem.
P-33768
DejaVu
» 2011-06-02 17:51:25
Czytając tylko temat daję odpowiedź: plik cały musisz sobie wczytać i potem zapisać. Nie da się wycinać fragmentów pliku.
P-33769
kamilo
Temat założony przez niniejszego użytkownika
» 2011-06-02 17:53:52
Nie wierzę, musi być jakiś sposób.
Skoro zawartość pliku można wyświetlić na ekranie bez tego wiersza co chcemy to chyba da się zapisać to spowrotem do tego pliku jako nowa zawartość, czy się mylę... ?
P-33770
absflg
» 2011-06-02 17:59:51
fstream
 jest strumieniem IO. Jednak strumienie strumienie IO mają w sobie DWA niezależne od siebie strumienie - wejściowy i wyjściowy. Jeżeli chcesz tylko edytować plik to czytanie go nie ma żadnego sensu, gdyż "wskaźnik" odpowiedzialny za zapis i tak będzie wciąż tkwił na początku. Używaj tylko
ofstream
.
P-33771
DejaVu
» 2011-06-02 18:08:13
Da się przesuwać wskaźniki odczytu i zapisu, niemniej jednak plik i tak będziesz musiał przepisywać co najmniej od miejsca jego modyfikacji aż do końca.
P-33773
kamilo
Temat założony przez niniejszego użytkownika
» 2011-06-02 18:10:11
Tak, wiem, że będę musiał przepisywać cały plik - nawet tak to miałem zaimplementowane w kodzie który wkleiłem jednak nie działało. Spróbuję z tym strumieniem ofstream...
P-33774
kamilo
Temat założony przez niniejszego użytkownika
» 2011-06-02 18:46:00
No nie bardzo wiem jak to rozwiązać.. :(
Jak mam wykorzystać ofstream skoro nie da się nic odczytać z ofstream. Przecież muszę jakoś "wyciągnąć" zawartość pliku, aby go potem z powrotem zapisać, ale już bez tego wiersza który chcę usunąć...

Zastanawia mnie, dlaczego wypisywanie zawartości pliku (już tego zmodyfikowanego - bez tego wiersza który chciałem usunąć) na ekran działa, a gdy chcę zapisać do pliku strumieniem "<<" to już nie...
P-33778
ison
» 2011-06-02 20:09:43
C/C++
#include <fstream>
#include <string>
#include <vector>

void kasuj_wiersz( const std::string sciezka, const size_t wiersz )
{
    std::vector < std::string > vec;
    std::ifstream in( sciezka.c_str() );
    std::string tmp;
    while( getline( in, tmp ) ) vec.push_back( tmp );
   
    in.close();
    std::ofstream out( sciezka.c_str() );
    for( size_t i = 0; i < vec.size(); ++i ) {
        if( i + 1 != wiersz ) out << vec[ i ] << std::endl;
       
    }
    out.close();
}

int main()
{
    kasuj_wiersz( "aaa.txt", 2 );
}
obsługę błędów już sobie sam możesz dorobić

Zastanawia mnie, dlaczego wypisywanie zawartości pliku (już tego zmodyfikowanego - bez tego wiersza który chciałem usunąć) na ekran działa, a gdy chcę zapisać do pliku strumieniem "<<" to już nie...
gdyż zapisujesz i wczytujesz z tego samego pliku w tym samym momencie
P-33779
« 1 » 2
  Strona 1 z 2 Następna strona