Wczytywanie liczb z pliku tekstowego

0

Witam, chciałem zrobić programik, który wypisze wszystkie liczby znajdujące się w notatniku, jako utrudnienie liczby te ukryłem między tekstem. To jest ten kod:

#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() )
        {
            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.//

Ps.
Myślałem, że problem leży w niewyczyszczeniu bufora strumienia jednak mimo wpisania przed continue plik.sync() problem nadal wystepuje

1
  1. O ile użycie i++ zamiast ++i w miejscach gdzie jest wszystko jedno co użyć jest ... http://4programmers.net/Forum/1101404 O tyle tam gdzie trzeba użyć ++i podział na dwie instrukcji tylko po to aby użyć i++ - to jakiś kryminał.
  2. Poza tym poczytaj o formatowaniu kodu: http://4programmers.net/Forum/998482
  3. W C++ należy deklarować zmienne tuż przed użyciem, daje to więcej możliwości optymalizatorowi.
  4. To ta twoja pętla, nieco poprawiona:
for(unsigned x=0;;)
  {
   int liczba;
   if(plik>>liczba) cout<<(++x)<< " liczba to: "<<liczba<<endl;
   else
     {
      plik.clear();
      if(plik.get()==EOF) break;
     }
  }
0

Dziękuję za odpowiedź, bardzo mi pomogła. Mam jednak jedno pytanie, do zakończenia tej nieskończonej pętli użyłeś warunku if(plik.get()==EOF) break;
Dlaczego po użyciu if(plik.eof()) break; nie działa tak samo? .eof() miał z tego co czytałem zwracać prawdę gdy wczytana została ostatnia dana i plik się "skończył", co jest więc jest nie tak?

1

Jeżeli nie udało się wczytać liczbę to kursor zostaje na tej samej literce co był.
Więc stoisz sobie na pierwszej literce i w kółko tą samą literkę próbujesz wczytać jako liczbę.
Więc potrzebujesz wywalić przynajmniej jeden znak.
Możnaby zrobić to następująco:

for(unsigned x=0;plik;plik.get())
  {
   int liczba;
   if(plik>>liczba) cout<<(++x)<< " liczba to: "<<liczba<<endl;
   else plik.clear();
  }

ale wtedy źle się odczyta taki plik: 100-2-3-4-5

0

Ja bym napisał to w ten sposób:


int main()
{
ifstream odczyt;
odczyt.open("plik.txt", ios::in);
while(!odczyt.eof())
{
    int licznik=0;
    string napis;
    getline(odczyt,napis);
    for(int i=0; i<napis.length(); i++)
    {
       if(napis.at(i)>='0' && napis.at(i)<='9')
       {
          licznik++;
       }
    }
cout<<"Liczba liczb="<<licznik<<endl;
}

odczyt.close();

return 0;
}

 
0
Jambor napisał(a):

Ja bym napisał to w ten sposób ...

Mam tylko dwa pytania:

  • ile liczb tu widzisz: 123?
  • czy odróżniasz cyfry od liczb?
0
_13th_Dragon napisał(a):
Jambor napisał(a):

Ja bym napisał to w ten sposób ...

Mam tylko dwa pytania:

  • ile liczb tu widzisz: 123?
  • czy odróżniasz cyfry od liczb?

Faktycznie, on chce wypisać liczby a nie zliczyc ich ilosc w pliku. Musialem zle przeczytać - święta :D W tym moim brakuje jeszcze petli for i malej modyfikacji którą zrobiłem by to co napisalem zadzialalo. Ale autorowi tematu chodzi o co innego

1 użytkowników online, w tym zalogowanych: 0, gości: 1