driver1995 Temat założony przez niniejszego użytkownika |
Zamiana jednego znaku z pliku na kilka » 2010-04-02 14:28:35 Witam... Mój problem polega na tym, że chciałbym odczytać z pliku każdy znak osobno, a zapisać np. zamiast jednego znaku 5 innych znaków... Nie mam pojęcia jak się za to zabrać... Oto kod (zły): char a[ 100 ]; fstream plik( "jakisplik", ios::in ); plik.read( a, 100 ); a[ 1 ] = { '&', '#', '2', '6', '3' };
Próbowałem zrobić z "char a" tablicę dwuwymiarową, ale wtedy wywalało błąd przy plik.read... Wiem, o co chodzi tylko tak wczytać z pliku tablicę 2-wymiarową, która początkowo traktowała by każdy znak jakby "char a[100][1]" a później żebym mógł to zapisać jako "char a[100][5]"... Tzn. wczytuję np. znak 'A', zamieniam na np. "znakA" i zapisuję... |
|
lenrokskate |
» 2010-04-02 15:58:42 użyj wektora - to taka tablica która może się rozszerzyć |
|
pekfos |
» 2010-04-02 17:13:15 znaczy z "abc" na "a&&&&&c" ? musisz realokować pamięć char * wstaw( char * s, char * w, int wh ) { int nw = strlen( s ) + strlen( w ) + 1; char * d = new char[ nw ]; for( int a = 0; a < wh; a++ ) d[ a ] = s[ a ]; for( int a = 0; a < strlen( w ) ) d[ a + wh ] = w[ a ]; for( int a = wh + strlen( w ); a < nw - 1 ) d[ a ] = s[ a - strlen( w ) ]; d[ nw - 1 ] = '\0'; return d; } nie wiem czy działa, ale sprawdź i ewentualnie popraw |
|
Elaine |
» 2010-04-02 17:54:52 O ja pierniczę... Co trzeba palić, żeby próbować zrobić to na c-stringach, mając do dyspozycji o wiele wygodniejszy std::string?
@pekfos: popracuj nad tym jeszcze trochę, a będziesz mógł brać udział w IOCCC. ;) |
|
pekfos |
» 2010-04-02 20:44:36 widząc jego fragment kodu widzę że robi w tablicach char. PS: niczego nie paliłem :P //edit: po poprawieniu (2) błędów kompilacji (których można dopatrzeć się w składni for (brakuje inkrementacji)) otrzymujemy ten oto w pełni sprawny kod char * wstaw( char * s, char * w, int wh ) { int nw = strlen( s ) + strlen( w ) + 1; char * d = new char[ nw ]; for( int a = 0; a < wh; a++ ) d[ a ] = s[ a ]; for( int a = 0; a < strlen( w ); a++ ) d[ a + wh ] = w[ a ]; for( int a = wh + strlen( w ); a < nw - 1; a++ ) d[ a ] = s[ a - strlen( w ) ]; d[ nw - 1 ] = '\0'; return d; } |
|
driver1995 Temat założony przez niniejszego użytkownika |
» 2010-04-02 21:49:14 Dzięki za odpowiedzi, ale przykład Pekfosa jest nieco dla mnie pogmatwany.. Próbowałem pokombinować coś z vectorem i prawie mi się udało lecz zauważyłem, że vector nie wykrywa mi białych znaków i po prostu je ignoruje, co w rezultacie daje taki efekt: zamiast "Tekst Przykładowy" powstaje "TekstPrzykładowy"... Jakbyście mogli mi dać jakąś radę jak zrobić, by vector jednak je wykrywał to był bym bardzo wdzięczny.. Z góry dziękuję :) Jeszcze dam kod (jakby mógł coś pomóc): #include<conio.h> #include<iostream> #include<console.ddt> #include<fstream> #include<vector> #include<iterator> using namespace std; using namespace ddt::console; struct ZNAK { char znak[ 6 ]; }; istream & operator >>( istream & str, ZNAK & obj ) { str >> obj.znak[ 0 ]; return str; } ostream & operator <<( ostream & str, const ZNAK & obj ) { str << obj.znak; return str; } int main() { ifstream plik( nazwa ); vector < ZNAK > X; copy( istream_iterator < ZNAK >( plik ), istream_iterator < ZNAK >(), back_inserter( X ) ); for( int i = 0; i < X.size(); i++ ) { } ofstream plikk( nazwa ); copy( X.begin(), X.end(), ostream_iterator < ZNAK >( plikk ) ); } |
|
Elaine |
» 2010-04-02 21:56:33 Przykład pekfosa jest zagmatwany dla każdego, bo jest napisany strasznie nieczytelnie, to wszystko ;) |
|
driver1995 Temat założony przez niniejszego użytkownika |
» 2010-04-02 22:44:17 Właśnie dlatego wolałem pokombinować z wektorem.. Z tym, że właśnie pozostała mi kwestia tych białych znaków ;/ |
|
« 1 » 2 |