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

getline przestaje działać gdy napotyka na znak 

Ostatnio zmodyfikowano 2011-12-29 11:44
Autor Wiadomość
robaczek122
Temat założony przez niniejszego użytkownika
getline przestaje działać gdy napotyka na znak 
» 2011-12-26 00:21:56
strzałeczka w prawo -  - w tablicy ASCII ma nr 26 - "SUB - (Substitute) - zastąpienie"

Prosty program typu:
C/C++
while( myfile.good() )
{
    getline( myfile, line );
    cout << line;
}
przestaje wczytywać kolejne linijki jak trafi na ten znak.

Ogólnie porównuję ze sobą dwa pliki, pobierając i porównują z każdego po jednej linii, więc jeśli ten znak występuje gdzieś na początku, przed pierwszą różnicą pomiędzy plikami, w wyniku dostaję, że dwa pliki są identyczne.
Ma ktoś jakiś pomysł jak to ominąć?
P-46273
DejaVu
» 2011-12-26 12:11:04
Jeżeli porównujesz dwa pliki to rób to binarnie, a nie tekstowo - użyj metody read z fstream-a.
P-46282
robaczek122
Temat założony przez niniejszego użytkownika
» 2011-12-26 12:36:18
ok, poczytam, dzięki za odpowiedź.

Zastanawiałem się jednak dlaczego w takim kodzie:
C/C++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    string line;
    ifstream myfile( "test.txt" );
    if( myfile.is_open() )
    {
        myfile.seekg( 1, ios_base::beg );
        if( myfile.fail() ) cout << "Fail" << endl;
       
        cout << myfile.tellg();
        getline( myfile, line ); //pierwsze pobranie
        cout << line << endl;
        cout << line.length() << endl;
        cout << myfile.tellg() << endl;
       
        myfile.seekg( 9, ios_base::beg );
        if( myfile.fail() ) cout << "Fail" << endl;
       
        cout << myfile.tellg();
        getline( myfile, line ); //drugie pobranie
        cout << line << endl;
       
        myfile.close();
    }
    else cout << "Unable to open file";
   
    getchar();
    return 0;
}

W pierwszym pobraniu pobiera od drugiego znaku (zgodnie z "myfile.seekg( 1, ios_base::beg );"), natomiast w drugim pobraniu, getline zwraca to samo co w pierwszym mimo zmienionego "myfile.seekg( 9, ios_base::beg );" z 1 na 9.
Czegoś chyba tu nie rozumiem...

EDIT:
Oki udało się binarnie, ale jeżeli ktoś może zaspokoić moją ciekawość dlaczego to powyżej działa sprzecznie z moją logiką, to będę bardzo wdzięczny.
P-46284
pekfos
» 2011-12-26 15:17:07
Ile bajtów ma ten plik? .fail() nie wychwytuje eofbita.
P-46304
robaczek122
Temat założony przez niniejszego użytkownika
» 2011-12-29 01:17:35
Plik może być dowolnie długi, byleby była 1 linijka. Nie wyskakuje żaden fail.
Plik nie musi zawierać też tego znaku, żeby program zachowywał się jak dla mnie dziwnie.
P-46545
pekfos
» 2011-12-29 09:59:29
getline zwraca to samo co w pierwszym mimo zmienionego "myfile.seekg( 9, ios_base::beg );" z 1 na 9.
Tak, nie rozumiesz.
P-46546
robaczek122
Temat założony przez niniejszego użytkownika
» 2011-12-29 11:44:06
Rozumiem, że nie rozumiałem tylko, że należy dać myfile.clear() ?
P-46557
« 1 »
  Strona 1 z 1