Sebastian__Zak Temat założony przez niniejszego użytkownika |
Wczytanie z pliku + wykasowanie znaku + zapis do pliku zmian » 2016-09-22 20:56:56 Cześć Poproszę o pomoc z tematem który nie daje mi spać ... Chciałbym otworzyć plik - może być test.txt, wykasować tam jakiś określony znak np. 'D'i z powrotem zapisać ten plik (ale już bez tych znaków) To co do tej pory naskrobałem to: #include <iostream> #include <fstream> #include <string>
using namespace std;
void RemoveCharFromString( char * p, char c ) { if( NULL == p ) return; char * pDes = p; while( * p ) { if( * p != c ) * pDes++ = * p; p++; } * pDes = '\0'; }
int main() { string tekst; ifstream mojplik( "abc.fil" ); if( mojplik.is_open() ) { while( mojplik.good() ) { getline( mojplik, tekst ); cout << tekst << endl; } mojplik.close(); } RemoveCharFromString( tekst, 'D' ); return 0; }
|
|
carlosmay |
» 2016-09-22 22:46:49 Edit: Można tak: #include <iostream> #include <string> #include <fstream> #include <algorithm>
void readTextFromFile( const std::string & fileName, std::string & text ) { std::ifstream fin( fileName ); if( fin.is_open() ) { std::getline( fin, text ); } else { std::cerr << "pliku nie udalo sie otworzyc\n"; } }
void eraseCharacters( std::string & text ) { std::string wynik; text.erase( std::remove_if( text.begin(), text.end(), []( char ch ) { return ch == 'D'; } ), text.end() ); }
void saveTextToFile( const std::string & fileName, std::string text ) { std::ofstream fout( fileName ); fout << text.c_str(); }
int main() { std::string fileName { anyFileName }; std::string text; readTextFromFile( fileName, text ); std::cout << text << '\n'; eraseCharacters( text ); std::cout << text << '\n'; saveTextToFile( fileName, text ); } aDaDaDaD aaaa |
|
Sebastian__Zak Temat założony przez niniejszego użytkownika |
» 2016-09-23 15:47:56 Dziękuje za pomoc, ale wywala mi błędy typu:
line 23: error: no matching function for call to ' remove_if(std::string<car>::iterator, std::basic_string<car>::iterator, eraseCharacters(std::string&)::<lambda(char)>)'
Proszę o podpowiedź co zrobić. |
|
karambaHZP |
» 2016-09-23 17:16:10 Lambdy są od C++11. Musisz włączyć ten standard w opcjach kompilatora. Najlepiej włączyć najnowszy dostępny standard. |
|
Sebastian__Zak Temat założony przez niniejszego użytkownika |
» 2016-09-26 10:49:38 OK dziękuje za Wasze rady - wszystko działa (bez Waszej pomocy bym tego nie ustawił) :) Co do zaczytywania pliku to mam jedno pytanko jak poprawić program aby zaczytywał więcej niż jedną linie? Program zaczytuje mi zawsze jedną linie (i usuwa z niej określony znak) ale nie widzi kolejnych linii ... Domyślam się, że problem jest w tym miejscu: if( fin.is_open() ) { std::getline( fin, text ); }
Jak to przerobić aby zaczytał mi zawszę cały plik txt? |
|
carlosmay |
» 2016-09-26 12:16:25 Jak to przerobić aby zaczytał mi zawszę cały plik txt? |
Użyj pętli. while( std::getline( fin, text ) ) { } |
|
Sebastian__Zak Temat założony przez niniejszego użytkownika |
» 2016-09-26 20:19:19 Witam ponownie Bawię się tym kodem i jedno zaczyna działać to drugie przestaje ... Zaczytuje mi całość, ale przestaje działać kasowanie i zapisywanie (zapisuje puste pliki). Nie rozumiem dodałem tylko pętle while jak kolega polecił wcześniej i się posypało. Poproszę o jakieś wskazówki do dalszej zabawy ponieważ sam tego nie rozwiąże. Mój kod: #include <iostream> #include <string> #include <fstream> #include <algorithm>
void readTextFromFile( const std::string & fileName, std::string & text ) { std::ifstream fin( "test.txt" ); while( !fin.eof() ) { std::getline( fin, text ); std::cout << text << std::endl; } }
void eraseCharacters( std::string & text ) { std::string wynik; text.erase( std::remove_if( text.begin(), text.end(), []( char ch ) { return ch == '"'; } ), text.end() ); }
void saveTextToFile( const std::string & fileName, std::string text ) { std::ofstream fout( "test_new.txt" ); fout << text.c_str(); }
int main() { std::string fileName { "test.txt" }; std::string text; readTextFromFile( fileName, text ); eraseCharacters( text ); std::cout << text << '\n'; saveTextToFile( fileName, text ); }
|
|
karambaHZP |
» 2016-09-26 20:32:46 Zmienna tekst jest nadpisywana ipo wyjściu z funkcji odczytującej z pliku zawiera ostatni wiersz. Dodaj jakiś kontener: np std::vector < std::string > i do niego zapisuj wczytane wiersze z pliku. |
|
« 1 » 2 |