Witam, to mój pierwszy post na tym forum to chciałbym na początek wszystkich pozdrowić i prosić o wyrozumiałość, zwłaszcza na początku..
Próbuje rozwiązać zadanie z wyszukaniem liczb w pliku tekstowym, w przypadku pierwszego kodu:
#include <iostream>
#include <fstream>
using namespace std;
bool otworz_plik( ifstream & fPlik, string fSciezka )
{
fPlik.open( fSciezka.c_str() );
if( fPlik.good() )
return true;
else
return false;
}
void zamknij_plik( ifstream & fPlik )
{
fPlik.close();
}
void wyswietl_plik( ifstream & fPlik )
{
string wers;
while( getline( fPlik, wers ) )
cout << wers << endl;
}
int suma_liczb_w_pliku( ifstream & fPlik )
{
int liczba, suma = 0, licznik = 0;
while( true )
{
fPlik.clear();
fPlik >> liczba;
if( fPlik.bad() )
break;
if( !fPlik.fail() )
{
cout << liczba << " ";
suma += liczba;
licznik++;
}
if( fPlik.eof() )
break;
}
cout << endl << "Znaleziono " << licznik << " liczb";
return suma;
}
int main()
{
ifstream plik;
string sciezka = "plik.txt";
if( otworz_plik( plik, sciezka ) )
{
cout << "Plik zostal otwarty poprawnie" << endl;
wyswietl_plik( plik );
}
else
cout << "Nie udalo sie otworzyc pliku" << endl;
zamknij_plik( plik );
if( otworz_plik( plik, sciezka ) )
{
cout << " " << suma_liczb_w_pliku( plik );
zamknij_plik( plik );
}
return 0;
}
program daje :
Plik zostal otwarty poprawnie
(...)
123
Wydaje mi się, że jest błąd w funkcji suma_liczb_w_pliku, po wczytaniu liczby 123 działanie programu nie kończy się, trwa w nieskończonej pętli. To już pozostawiam Wam. Moja druga próba rozwiązania zadania skupiła się na zmianie ww funkcji i wklejam tylko kod tej funkcji, reszta jest identyczna więc może akurat tam coś jest nie tak.
int suma_liczb_w_pliku( ifstream & fPlik )
{
int liczba, suma = 0, licznik = 0, pozycja = 0;
char znak;
while( true )
{
fPlik.clear();
fPlik >> znak;
if( fPlik.bad() )
break;
if( !isspace( znak ) && pozycja == 0 )
{
fPlik.seekg( 0 ) >> liczba;
if( fPlik.bad() )
break;
}
if( !isspace( znak ) && pozycja != 0 )
{
fPlik >> liczba;
if( fPlik.bad() )
break;
}
if( !fPlik.fail() )
{
cout << liczba << " ";
suma += liczba;
licznik++;
}
else
if( fPlik.eof() )
break;
pozycja++;
}
W tym przypadku program wyswietla :
Plik zostal otwarty poprawnie
123Wprowadzenie
(...)
123 1 196 12 68 24 10 68 4 20 6 202 0 377 5 1996 1995
Znaleziono 17 liczb 5107
W tym przypadku program kończy działanie i niby wszystko ok poza miejscami w tekście '12 368' , '10 368' , '4 420 606' bo z każdej liczby bezpośrednio za spacją ucina pierwszą cyfre. Dołączam również kod trzeciej mojej próby, która daje identyczny wynik.
int suma_liczb_w_pliku( ifstream & fPlik )
{
int liczba, suma = 0, licznik = 0, pozycja = 0, seekg;
char znak;
while( true )
{
fPlik.clear();
seekg = fPlik.tellg();
fPlik >> znak;
if( fPlik.bad() )
break;
if( znak == 1 || znak == 2 || znak == 3 || znak == 4 || znak == 5 || znak == 6 || znak == 7 || znak == 8 || znak == 9 )
{
fPlik.seekg( seekg );
fPlik >> liczba;
if( fPlik.bad() )
break;
}
if( !isspace( znak ) && pozycja == 0 )
{
fPlik.seekg( 0 ) >> liczba;
if( fPlik.bad() )
break;
}
if( !isspace( znak ) && pozycja != 0 )
{
fPlik >> liczba;
if( fPlik.bad() )
break;
}
if( !fPlik.fail() )
{
cout << liczba << " ";
suma += liczba;
licznik++;
}
else
if( fPlik.eof() )
break;
pozycja++;
}
Przepraszam jeśli post jest za długi, mam nadzieję, że jest wystarczająco czytelny.