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

Wczytywanie znaku nowej lini z pliku

Ostatnio zmodyfikowano 2012-11-13 08:49
Autor Wiadomość
anonim
Temat założony przez niniejszego użytkownika
Wczytywanie znaku nowej lini z pliku
» 2012-11-12 20:00:50
Cześć
Od dwóch dni męczę się nad czymś takim(mniej więcej ;))
C/C++
#include <iostream>
#include <fstream>
#include <string>

int main()
{
    char wyraz[] = "abcd\nefgh";
    std::fstream plik;
    plik.open( "dane.txt", std::ios::in | std::ios::binary );
    if( plik.good() )
    {
        std::string napis;
        std::cout << "\nZawartosc pliku:" << std::endl;
        while( !plik.eof() )
        {
            getline( plik, napis );
            std::cout << napis << std::endl;
            if( wyraz == napis )
                 std::cout << "toże same!!!\n";
           
        }
        plik.close();
    } else std::cout << "Error! Nie udalo otworzyc sie pliku!" << std::endl;
   
}

Wyraz wczytany z pliku jest teoretycznie taki sam jak char[] wyraz. Jednak przez użycie znaku nowej linii program nie rozpoznaje, że to takie same wyrazy.
Ogólnie w pliku dane ma być słownik polsko-angielski. Plik wyglądałby jakoś tak:
good~dobry
bad~zły
ugly~brzydki
...

Udało mi się już napisać funkcję tłumacza (działa ona w ten sposób, że sprawdza w plik w pętli i zwraca wyraz po lub przed znakiem ~ (to zależy od języka na który
tłumaczymy), jednak problem jest, kiedy wyraz wygląda np. tak:
Sterowanie\n\n\n\n\nChodzenie - strzałki/nstrzelanie - myszka(...)~Movement\n\n\n\n\nMoving - arrows\nshoot - mouse(...)

I mam pytanie - co zrobić ze znakami nowej linii?
P-69061
cyklopek11
» 2012-11-12 20:29:47
C/C++
if( wyraz == napis )
To nigdy nie będzie spełnione! Tablica char-ów  nie równa się zmiennej std::string ! - FAKT -  mój błąd.

Pamiętaj również, że jak tworzysz pliki txt na Windowsie w obcych programach niż w swoim własnym każda linia (zwykle) jest zakończona bajtami 0x0D, 0x0A. Plikami tekstowymi, tworzonymi przez programy typu notatnik operuje się zwykle otwierając je tekstowo a nie binarnie.

Ja na Twoim miejscu zrobiłbym tak:
1.) pliki otwierałbym tekstowo pamiętając, że koniec linii to 0x0D, 0x0A
2.) zamiast użycia spacji pomiędzy złożonymi wyrażeniami używałbym w pliku _
3.) po wczytaniu w pliku zamieniałbym ją na spację
4.) spację natomiast w pliku wykorzystałbym do oddzielania słowkoWjęzykuA słówkoWjęzykuB.
5.) Poszczególne linie wczytujesz sobie getline() do stringów i po kłopocie 
P-69065
Mrovqa
» 2012-11-12 20:52:22
if( wyraz == napis )
To nigdy nie będzie spełnione! Tablica char-ów  nie równa się zmiennej std::string !
Nie pisz na forum niczego, czego nie jesteś pewien. Lepszy jest brak informacji niż dezinformacja. Sprawdź sobie porównanie std::string i char* - to nie jest porównanie na zasadzie char* z char*. Słyszałeś o czymś takim, co się zwie przeładowanie operatorów?

/edit:
@autor getline wczytuje Ci jedną linię (używasz domyślnego znaku terminatora - '\n'), a porównujesz wczytany tekst z ciągiem, który zawiera '\n'. Nigdy Twój warunek nie zostanie spełniony.
P-69069
anonim
Temat założony przez niniejszego użytkownika
» 2012-11-13 08:49:14
sorry, ale tego "1.) pliki otwierałbym tekstowo pamiętając, że koniec linii to 0x0D, 0x0A" niezbyt rozumiem"
C/C++
std::string translate( std::string string, std::string tl, std::string dictionaryName )
{
    std::string retString;
    std::ifstream plik;
    std::string napis;
    plik.open( "dane.txt", std::ios::in );
    if( plik.good() )
    {
        while( !plik.eof() )
        {
            getline( plik, napis );
            for( unsigned int i = 0; i < napis.size(); i++ )
            {
                if( napis[ i ] == '~' )
                {
                    if( tl == "ENGTOPOL" )
                    {
                        if( kopiuj( 0, i, napis ) == string )
                        {
                            retString = kopiuj( i + 1, napis.size(), napis );
                            return retString;
                            break;
                        }
                    }
                    else if( tl == "POLTOENG" )
                    {
                        if( kopiuj( i + 1, napis.size(), napis ) == string )
                        {
                            retString = kopiuj( 0, i, napis );
                            return retString;
                            break;
                        }
                    }
                    else if( tl != "ENGTOPOL" and tl != "POLTOENG" )
                    {
                        std::string retstringaaa = "Nie ma tłumaczenia w tych językach!!!\n";
                        return retstringaaa;
                    }
                   
                }
            }
           
        }
    }
    else std::cout << "Error! Nie udalo otworzyc sie pliku!" << "\n";
   
    plik.close();
   
    return string;
}
to jest funkcja tłumacząca z pliku, użycie np:
C/C++
std::string cos = translate( string.GetText(), "ENGTOPOL", "dane.txt" );
I jak dodać obsługę znaków nowej linii?
P-69103
« 1 »
  Strona 1 z 1