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: #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; wyjscie << endl << line; } return 0; }
Pozdrawiam. |
|
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. |
|
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: #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. |
|
karambaHZP |
» 2016-09-28 16:34:59 Sprawdzaj stan pliku po próbie otwarcia. Zaoszczędzisz sobie problemów. |
|
Shnycell Temat założony przez niniejszego użytkownika |
» 2016-09-28 19:49:06 Wrzuciłem w pętlę while: #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 ); 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. |
|
carlosmay |
» 2016-09-28 22:17:39 vec.erase( vec.end(), vec.end() + 7 );
|
To jest błędne. Od razu startujesz za tablicą. vec.end() to miejsce za ostatnim elementem. Kontrolę EOF powinno się przeprowadzać bezpośrednio po próbie odczytu, a dopiero na jej podstawie zrobić coś z zaczytanymi danymi. while( true ) { getline( plik, linia ); if( !plik.eof() ) { vec.push_back( linia ); } else { break; } } Tak jest dużo lepiej. while( getline( plik, linia ) ) { vec.push_back( linia ); } |
|
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: for( std::string linia; std::getline( plik, linia ); ) { }
Obiekt linia zostanie utworzony, kiedy program zacznie wykonywać pętle i zostanie usunięty po jej zakończeniu. |
|
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. |
|
« 1 » 2 |