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 |