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

Zamiana tekstu w pliku

Ostatnio zmodyfikowano 2013-07-22 05:18
Autor Wiadomość
maniek1310
Temat założony przez niniejszego użytkownika
Zamiana tekstu w pliku
» 2013-07-19 18:41:47
Witam mógłbym was prosić o sprawdzenie tego pliku, gdyż po skompilowaniu dochodzi do otworzenie plik.txt i plik2.txt i dalej już nic nie robi.

Program ma sprawdzać każdą linię i gdy natrafi na słowo english, zamienić go na polish.

Oto kod :
C/C++
string linia;
fstream plik;
fstream plik2;

plik.open( "plik.txt", ios::in );
plik2.open( "plik2.txt", ios::out | ios::app );
if( plik.good() == true and plik2.good() == true )
{
    while( !plik.eof() )
    {
        getline( plik, linia );
        string a( "english" );
        string b( "polish" );
        int n = linia.find( a );
        linia.replace( n, b.size(), b );
        plik2 << linia << endl;
        cout << linia << endl;
    }
}

plik.close();
plik2.close();
P-88354
Savail
» 2013-07-19 18:50:22
Sprawdzaj wynik metody std::string::find. Jeśli nie znajdzie danego słowa to zwraca std::string::npos. Wykonuj dalsze operacje tylko jeśli zwróci wartość >= 0. I przed zapisywaniem do pliku dodawaj do zmiennej linia znak nowej lini czyli '\n'.
P-88355
maniek1310
Temat założony przez niniejszego użytkownika
» 2013-07-19 18:53:27
Sprawdziłem kod po linijce i okazało się że tu coś jest nie tak :
linia.replace( n, b.size(), b );


Ps. Okazało się że jeżeli n przyjmowało wartość -1 to funkcja .replace nie chciała zmieniać tekstu więc dodałem instrukcję warunkową i teraz wszystko działa. Temat można zamknąć.

Tutaj kod jak by ktoś chciał :
C/C++
string linia;
fstream plik;
fstream plik2;

plik.open( "plik.txt", ios::in );
plik2.open( "plik2.txt", ios::out | ios::trunc );
if( plik.good() == true and plik2.good() == true )
{
    while( !plik.eof() )
    {
        getline( plik, linia );
        string a( "english" );
        string b( "polish" );
        int n = linia.find( a, 0 );
        if( n != - 1 )
        {
            linia.replace( n, a.size(), b );
        }
        plik2 << linia << endl;
        cout << linia << endl;
    }
}

plik.close();
plik2.close();
P-88357
maniek1310
Temat założony przez niniejszego użytkownika
» 2013-07-19 19:58:51
Przepraszam że otwieram ale pojawił się kolejny problem kodowanie pliku. Jest plik przepuśćmy "test.ini" gdy zamienię jakiś wyraz i zapiszę do nowego pliku przypuśćmy "test2.ini" to w niektórych miejscach są "krzaczki". I tutaj teraz moje pytanie da radę ustawić kodowanie zaraz po otworzeniu pliku test.ini ??

Kodowanie w pliku test.ini to jest "UCS-2 Little Endian" i chciałbym zmienić na np. "UTF-8".
P-88364
Monika90
» 2013-07-19 20:13:09
Twój kod zawiera bardzo popularny błąd
C/C++
while( !plik.eof() )
{
    getline( plik, linia );
    rob_cos( linia );
}
eof albo flagi błędów należy sprawdzać po próbie odczytu a nie przed:
C/C++
while( getline( plik, linia ) )
{
    rob_cos( linia );
}

if( plik.eof() )
     cout << "wczytano calosc";
else
     cout << "error";


Takie coś też jest dziwne:
C/C++
if( plik.good() == true and plik2.good() == true )
wystarczy:
C/C++
if( plik.good() && plik2.good() )
a najlepiej:
C/C++
if( plik && plik2 )
P-88365
maniek1310
Temat założony przez niniejszego użytkownika
» 2013-07-19 20:20:19
@up a kodowanie to jak mam zrobić ??
P-88367
Monika90
» 2013-07-19 20:28:12
Po pierwsze musisz użyć std::wifstream do czytania i std::wstring do przechowywania tekstu. I zwiazać ze strumieniami odpowiednie locale z ustawioną konwersją znaków, (codecvt_utf16, codecvt_utf8)
P-88369
maniek1310
Temat założony przez niniejszego użytkownika
» 2013-07-19 20:39:24
A byś wysłała mi link do biblioteki "codecvt" bo nie mogę znaleźć ??
P-88372
« 1 » 2
  Strona 1 z 2 Następna strona