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

[C++]Wczytywanie liczb z pliku tekstowego

Ostatnio zmodyfikowano 2015-12-27 02:06
Autor Wiadomość
Euvarios
Temat założony przez niniejszego użytkownika
[C++]Wczytywanie liczb z pliku tekstowego
» 2015-12-26 20:46:01
Witam, chciałem zrobić program, który wypisze wszystkie liczby znajdujące się w notatniku, jako utrudnienie liczby te ukryłem między tekstem. To jest ten kod:

C/C++
#include <iostream>
#include <fstream>
using namespace std;

void wypisanieLiczb_plik( string nazwaPiku )
{
    int liczba;
    int x = 1;
    plik.open( nazwaPiku.c_str() );
   
    if( plik.bad() )
    {
        cout << "Nie udalo sie otworzyc pliku..." << endl;
        plik.close();
        return;
    }
   
   
    while( !plik.eof() )
    {
        plik >> liczba;
       
        if( plik.fail() ) //Jezeli natrafi na wyraz zamiast na liczbe, wyczysci flagi i pominie dalsza czesc petli
        {
            plik.clear();
            continue;
        }
       
        x++;
        cout << x << " liczba to: " << liczba << endl;
    }
   
    plik.close();
}

int main()
{
    wypisanieLiczb_plik( "tekst.txt" );
   
    return 0;
}

Problem leży w tym, że wpada on w nieskończoną pętlę while i nie mam pojęcia dlaczego. Jestem świeżo po czytaniu kursu o obsłudze plików i mogłem źle zrozumieć jakąś komendę dlatego chciałbym żeby ktoś przeanalizował to co napisałem i poprawił mnie.

Tutaj dodatkowo zawartość pliku tekstowego na którym pracuję...:

To 23 jest 32 tekst.
Ten tekst 54 jest bardzo dziwny.
Nie ma w nim nic 123 ciekawego.
Czy jestes 69 pewien, że chcesz go czytac?
To trudno bo 3 ten tekst sie wlasnie 82 konczy.
P-142395
carlosmay
» 2015-12-26 21:25:54
C/C++
if( plik.fail() ) //Jezeli natrafi na wyraz zamiast na liczbe, wyczysci flagi i pominie dalsza czesc petli
{ // ale nie opruzniasz strumienia z zalegajacych nieprawidlowych danych, i przy nastepnej probie wczytania znow jest blad
    plik.clear();
    continue;
}
 
P-142396
Euvarios
Temat założony przez niniejszego użytkownika
» 2015-12-26 21:41:11
Rozumiem, że mam wyczyścić bufor strumienia używając .sync()? Nie mam pojęcia jednak do jakiego obiektu się odnieść... Możesz mi napisać co powinienem wyczyścić? Dodanie przed continue linijki plik.sync() nie rozwiązuje problemu
P-142397
carlosmay
» 2015-12-27 02:06:12
plik.ignore( numeric_limits < streamsize >::max(), ' ' );

Zamieniłbym wczytywanie do zmiennej liczbowej na zmienną typu std::string ,
sprawdzał po wczytaniu czy string zawiera cyfry, jeśli tak skonwertować na liczbę
(oczywiście jeśli trzeba) i wypisał liczbę.
P-142401
« 1 »
  Strona 1 z 1