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:
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; } 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. |
|
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. |
|
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ę... ? |
|
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 . |
|
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. |
|
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... |
|
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... |
|
ison |
» 2011-06-02 20:09:43 #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 |
|
« 1 » 2 |