Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zamiana jednego znaku z pliku na kilka

Ostatnio zmodyfikowano 2010-04-02 23:31
Autor Wiadomość
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):
C/C++
char a[ 100 ];
fstream plik( "jakisplik", ios::in ); //otwieram plik
plik.read( a, 100 ); //odczytuje każdy znak osobno
a[ 1 ] = { '&', '#', '2', '6', '3' }; //chciałbym, żeby dało się tak zrobić..
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ę...
P-15704
lenrokskate
» 2010-04-02 15:58:42
użyj wektora - to taka tablica która może się rozszerzyć
P-15705
pekfos
» 2010-04-02 17:13:15
znaczy z "abc" na "a&&&&&c" ?
musisz realokować pamięć
C/C++
char * wstaw( char * s, char * w, int wh ) {
    int nw = strlen( s ) + strlen( w ) + 1; //nowy rozmiar
    char * d = new char[ nw ]; //nowa tablica
    for( int a = 0; a < wh; a++ ) //kopiujemy do znaku wh
         d[ a ] = s[ a ];
   
    for( int a = 0; a < strlen( w ) ) //kopiujemy wstawkę
         d[ a + wh ] = w[ a ];
   
    for( int a = wh + strlen( w ); a < nw - 1 ) //kopiujemy resztę
         d[ a ] = s[ a - strlen( w ) ];
   
    d[ nw - 1 ] = '\0'; //dodajemy zero na koniec
    return d;
}

nie wiem czy działa, ale sprawdź i ewentualnie popraw
P-15707
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. ;)
P-15709
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
C/C++
char * wstaw( char * s, char * w, int wh ) {
    int nw = strlen( s ) + strlen( w ) + 1; //nowy rozmiar
    char * d = new char[ nw ]; //nowa tablica
    for( int a = 0; a < wh; a++ ) //kopiujemy do znaku wh
         d[ a ] = s[ a ];
   
    for( int a = 0; a < strlen( w ); a++ ) //kopiujemy wstawkę
         d[ a + wh ] = w[ a ];
   
    for( int a = wh + strlen( w ); a < nw - 1; a++ ) //kopiujemy resztę
         d[ a ] = s[ a - strlen( w ) ];
   
    d[ nw - 1 ] = '\0'; //dodajemy zero na koniec
    return d;
}
P-15718
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):
C/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()
{
    //cos tam nieistotnego
    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++ )
    {
        //zamiana znaków
    }
    ofstream plikk( nazwa );
    copy( X.begin(), X.end(), ostream_iterator < ZNAK >( plikk ) );
    //reszta...
}
P-15721
Elaine
» 2010-04-02 21:56:33
Przykład pekfosa jest zagmatwany dla każdego, bo jest napisany strasznie nieczytelnie, to wszystko ;)
P-15722
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 ;/
P-15727
« 1 » 2
  Strona 1 z 2 Następna strona