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

Kasowanie danych z wektora (plik.txt)

Ostatnio zmodyfikowano 2016-09-30 00:38
Autor Wiadomość
Shnycell
Temat założony przez niniejszego użytkownika
Kasowanie danych z wektora (plik.txt)
» 2016-09-28 12:31:26
Witam Wszystkich, jestem nowy na tym forum i nie dawno zacząłem przygodę z językiem C++.
Nie mogę zrozumieć pewnej rzeczy, przykład:
Wczytuję plik txt. przy pomocy wektora i zapisuję do innego pliku, operacja ma na celu usunięcie np. sześć pierwszych
linijek wczytywanego tekstu... Nie za bardzo wiem jak mam użyć funkcję erase, bo nie działa to dobrze a właściwie w ogóle.
Oto coś takiego:

C/C++
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;

int main()
{
    vector < string > vec;
    string line;
    fstream plik( "gcode.txt" );
    ofstream wyjscie( "gcode1.txt" );
   
    while( !plik.eof() )
    {
        getline( plik, line );
        vec.push_back( line );
        vec.erase( vec.begin(), vec.begin() + 6 );
        cout << endl;
        cout << line; // wyswietlam na ekranie, żeby sprawdzac czy dziala
        wyjscie << endl << line;
    }
   
    return 0;
}


Pozdrawiam.


P-152084
carlosmay
» 2016-09-28 12:40:32
Najpierw wczytaj wszystkie linie do vectora.
Następnie usuń te linie, które mają być usunięte.
Następnie zapisz to co zostało do pliku.

Teraz masz wszystko w jednej pętli i próbujesz usunąć sześć elementów vectora, a jest tylko jeden
i tak w każdym cyklu pętli.
P-152085
Shnycell
Temat założony przez niniejszego użytkownika
» 2016-09-28 14:48:33
Dzięki za wskazówkę! Teraz działa jak należy i tak to wygląda:

C/C++
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector < string > vec;
    string linia;
    fstream plik( "gcode.txt" );
    ofstream wyjscie( "gcode1.txt" );
   
    while( !plik.eof() )
    {
        getline( plik, linia );
        vec.push_back( linia );
    }
   
    vec.erase( vec.begin(), vec.begin() + 6 );
   
    for( int i = 0; i < vec.size(); i++ )
    {
        cout << endl;
        cout << vec[ i ];
        wyjscie << endl << vec[ i ];
    }
   
    return 0;
}

Pozdrawiam.

P-152087
karambaHZP
» 2016-09-28 16:34:59
Sprawdzaj stan pliku po próbie otwarcia. Zaoszczędzisz sobie problemów.
P-152088
Shnycell
Temat założony przez niniejszego użytkownika
» 2016-09-28 19:49:06
Wrzuciłem w pętlę while:

C/C++
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector < string > vec;
    string linia;
    fstream plik( "gcode.txt" );
    ofstream wyjscie( "gcode1.txt" );
   
    if( plik.is_open() )
    {
        while( !plik.eof() )
        {
            getline( plik, linia );
            vec.push_back( linia );
        }
       
        vec.erase( vec.begin(), vec.begin() + 8 );
        vec.erase( vec.end(), vec.end() + 7 ); //kasowanie siedmiu linijek od końca
       
        for( int i = 0; i < vec.size(); i++ )
        {
            cout << endl;
            cout << vec[ i ];
            wyjscie << endl << vec[ i ];
        }
    }
    else
         cout << "Blad pliku!!!";
   
    cout << endl;
   
    return 0;
}

Profilaktycznie wrzucam kod. Jeszcze dodałem linijkę odpowiedzialną za kasowanie 7 ostatnich linijek.


P-152092
carlosmay
» 2016-09-28 22:17:39
C/C++
vec.erase( vec.end(), vec.end() + 7 ); //kasowanie siedmiu linijek od końca
To jest błędne. Od razu startujesz za tablicą. vec.end() to miejsce za ostatnim elementem.


while( !plik.eof() )
Kontrolę EOF powinno się przeprowadzać bezpośrednio po próbie odczytu, a dopiero na jej podstawie zrobić coś z zaczytanymi danymi.
C/C++
while( true )
{
    getline( plik, linia );
    if( !plik.eof() )
    {
        vec.push_back( linia );
    }
    else
    {
        break;
    }
}

Tak jest dużo lepiej.
C/C++
while( getline( plik, linia ) )
{
    vec.push_back( linia );
}
P-152099
kmlkamilek
» 2016-09-29 00:02:11
Jeśli obiekt linia nie jest potrzebny po za pętlą, to można odczytać plik linijka po linijce również w ten sposób:
C/C++
for( std::string linia; std::getline( plik, linia ); )
{
    //Tu robisz przetwarzasz odczytaną linie
}

Obiekt linia zostanie utworzony, kiedy program zacznie wykonywać pętle i zostanie usunięty po jej zakończeniu.
P-152101
carlosmay
» 2016-09-29 01:02:53
można odczytać plik linijka po linijce również w ten sposób:
Moim zdaniem użycie pętli
for
 jest lekkim nadużyciem i zmniejsza zdecydowanie czytelność kodu.
P-152103
« 1 » 2
  Strona 1 z 2 Następna strona