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

Konwersja pliku tekstowego

Ostatnio zmodyfikowano 2017-08-14 10:37
Autor Wiadomość
mrukat990
Temat założony przez niniejszego użytkownika
Konwersja pliku tekstowego
» 2017-08-13 17:58:46
Piszę program, który wykona konwersję pliku tekstowego zamieniając małe litery na duże i duże na małe. Niestety program nie zamienia właściwie tekstu. Gdzie popełniam błąd?
C/C++
using namespace std;
char zamien( char c )
{
    if( c == toupper( c ) )
    {
        c = tolower( c );
    }
    else
    {
        c = toupper( c );
    }
   
    return c;
}

int main()
{
   
    char c;
    fstream wejscie, wyjscie;
    wejscie.open( "dane.txt", ios::in );
    wyjscie.open( "zmienione.txt", ios::out );
    if( wejscie.good() && wyjscie.good() )
    {
        while( !wejscie.eof() )
        {
            wejscie.get( c );
            c = zamien( c );
            wyjscie.put( c );
        }
    }
    wejscie.close();
    wyjscie.close();
    return 0;
}
P-163950
Kinexity
» 2017-08-13 18:35:03
C/C++
#include <fstream>
using namespace std;

char zamien( char c ) {
    return( c == toupper( c ) ? tolower( c )
        : toupper( c ) );
}

int main() {
    char c;
    fstream wejscie( "dane.txt", ios::in ), wyjscie( "zmienione.txt", ios::out );
    if( wejscie.is_open() && wyjscie.is_open() ) {
        wejscie.seekg( ios_base::beg );
        wyjscie.seekp( ios_base::beg );
        while( !wejscie.eof() ) {
            wejscie >> c;
            wyjscie << zamien( c );
        }
    }
    wejscie.close();
    wyjscie.close();
    return 0;
}
 - w takiej postaci działa dobrze w  VS2017
P-163952
j23
» 2017-08-13 18:45:17
"nie zamienia właściwie tekstu" czyli co jest źle?

Popraw pętle na:
C/C++
while( wejscie.get( c ) )
{
    wyjscie.put( zamien( c ) );
}

Zamiast if( c == toupper( c ) ) { ... } daj if( isupper( c ) ) { ... }

Jeśli problemem są polskie znaki, to na początku main daj wywołanie setlocale(LC_CTYPE, ".1250"); (1250 to kodowanie znaków, może być inne).
P-163953
mrukat990
Temat założony przez niniejszego użytkownika
» 2017-08-13 18:56:29
Dziękuję bardzo za pomoc. Program dzięki Wam działa prawidłowo. Czy można by ten program napisać wykorzystując klasę string?
P-163954
j23
» 2017-08-13 19:13:50
Można:
C/C++
string s = "ęąśhggfWERds";

transform( s.begin(), s.end(), s.begin(),[]( char c ) {
    return isupper( c ) ? tolower( c )
        : toupper( c );
} );
P-163955
mrukat990
Temat założony przez niniejszego użytkownika
» 2017-08-13 20:58:37
Przy kompilacji Code::Blocks zgłasza błąd dotyczący transform:
D:\C++\xxx\main.cpp|26|error: no matching function for call to 'transform(std::basic_string<char>::iterator, std::basic_string<char>::iterator, std::basic_string<char>::iterator, main()::<lambda(char)>)'|

P-163957
Monika90
» 2017-08-13 21:09:47
@j23
Argument dla toupper, tolower, isupper, itp. musi mieć wartość z zakresu typu unsigned char lub być równy EOF, polskie litery nie spełniają tego warunku w implementacjach w których char jest typem ze znakiem.

P-163959
mrukat990
Temat założony przez niniejszego użytkownika
» 2017-08-13 21:14:26
Zmieniłem string s tak aby nie zawierał polskich znaków i też zgłasza błąd jak wcześniej.
P-163960
« 1 » 2
  Strona 1 z 2 Następna strona