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

Czy metoda eof() musi wczytać endl, żeby zwrócić wartość false?

Ostatnio zmodyfikowano 2016-04-24 18:30
Autor Wiadomość
Lucas535
Temat założony przez niniejszego użytkownika
Czy metoda eof() musi wczytać endl, żeby zwrócić wartość false?
» 2016-04-23 18:25:08
Jeżeli wczytuję dane z pliku wierszami, a w końcu ostatniego nie ma endl, eof() zwraca true. Da się jakoś temu zapobiec?
P-147565
Monika90
» 2016-04-23 18:40:20
A dlaczego chcesz temu zapobiec? Poza tym znak końca linii nie nazywa się endl tylko \n
P-147566
Lucas535
Temat założony przez niniejszego użytkownika
» 2016-04-23 19:56:59
Chcę się dowiedzieć, czy można odczytać dane z pliku, który nie miałby na końcu tego przeniesienia. Poza tym znak '\n' również jest interpretowany jako koniec pliku i nie można wczytać tak zakończonego wiersza, trzeba użyć endl.
P-147568
Monika90
» 2016-04-23 20:47:11
Można odczytać dane do końca, dlaczego nie?

Jedynym problemem może być znak o kodzie 26, ponieważ w Windows biblioteki standardowe niektórych języków programowania uznają ten znak za znacznik końca pliku. Otworzenie pliku w trybie binarnym zapobiega takiemu zachowaniu.


 Poza tym znak '\n' również jest interpretowany jako koniec pliku
Na pewno nie w Windows, pod Linuksem też nie.
P-147569
Lucas535
Temat założony przez niniejszego użytkownika
» 2016-04-23 21:25:08
Jest tak jak pisałem. Może to zależy od kompilatora? Sprawdzę jeszcze później na innym.
P-147570
mateczek
» 2016-04-24 06:20:19
wklej kod którym czytasz to się przeanalizuje. I wtedy jest szansa wyłapać gdzie masz błąd
znak '\n' również jest interpretowany jako koniec pliku i nie można wczytać tak zakończonego wiersza, trzeba użyć endl.
coś Ci się pomieszało!!!

1. koniec wiersza czasami jest to '/n'(linux) a czasem '/r'+'/n' dwa znaki o kodach 13 10 hex(0D,0A)(windows). 
https://pl.wikipedia.org/wiki​/Koniec_linii

2. znak '/n' nie ma nic wspólnego z końcem pliku

3. pliki czytaj pętlą
C/C++
string linia;
while( geline( plik, linia ) ) {
    //tutaj obróbka linijki tekstu
   
}
P-147576
Lucas535
Temat założony przez niniejszego użytkownika
» 2016-04-24 10:55:26
Nic mi się nie pomieszało, przecież nie piszę tego z głowy tylko to co robi program.
Po pierwsze, bez endl na końcu program nie wypisze ostatniego wersu:
C/C++
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    char napis[ 50 ];
    fstream fout;
    fout.open( "abc.txt", ios::out );
    fout << "wiersz 1" << endl;
    fout << "wiersz 2" << endl;
    fout << "wiersz 3";
    ifstream fin;
    fin.open( "abc.txt" );
    while( !fin.eof() )
    {
        fin.getline( napis, 50 );
        cout << napis << endl;
    }
    fin.close();
    fout.close();
    return 0;
}

Po drugie, gdy napotka '\n', interpretuje jako koniec pliku (jest to już w pierwszym wierszu, więc go nie wypisuje):
C/C++
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    char napis[ 50 ];
    fstream fout;
    fout.open( "abc.txt", ios::out );
    fout << "wiersz 1\n";
    fout << "wiersz 2\n";
    fout << "wiersz 3";
    ifstream fin;
    fin.open( "abc.txt" );
    while( !fin.eof() )
    {
        fin.getline( napis, 50 );
        cout << napis << endl;
    }
    fin.close();
    fout.close();
    return 0;
}

Po trzecie, wypisze wszystkie dane jeśli w ostatnim wierszu dodałem endl:
C/C++
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    char napis[ 50 ];
    fstream fout;
    fout.open( "abc.txt", ios::out );
    fout << "wiersz 1" << endl;
    fout << "wiersz 2" << endl;
    fout << "wiersz 3" << endl;
    ifstream fin;
    fin.open( "abc.txt" );
    while( !fin.eof() )
    {
        fin.getline( napis, 50 );
        cout << napis << endl;
    }
    fin.close();
    fout.close();
    return 0;
}

Oczywiście do pliku są zapisywane wszystkie dane, można sprawdzić. Może robię coś źle, nie wiem, więc pytam.
Na koniec dodam, że gdy ręcznie wpisuję dane do pliku, bez przeniesienia po ostatnim wierszu to program czyta wszystko.
P-147582
mateczek
» 2016-04-24 11:17:47
// a teraz ??
C/C++
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    char napis[ 50 ];
    fstream fout;
    fout.open( "abc.txt", ios::out );
    fout << "wiersz 1" << endl;
    fout << "wiersz 2" << endl;
    fout << "wiersz 3"; // strumienie są buforowane !! endl domyka bufor
    fout.close(); // albo zamknji plik też domkniesz bufor
   
   
    ifstream fin;
    fin.open( "abc.txt" );
    while( !fin.eof() )
    {
        fin.getline( napis, 50 );
        cout << napis << endl;
    }
    fin.close();
   
    return 0;
}
P-147583
« 1 » 2 3
  Strona 1 z 3 Następna strona