• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z końcem pliku While ( !plik.eof() )

Object Storage Arubacloud
0 głosów
3,585 wizyt
pytanie zadane 4 sierpnia 2015 w C i C++ przez kmieciak_m Mądrala (7,450 p.)

Podczas wesołego programowania natrafiłem na dziwną rzecz. Chcąc aby pętla zakończyła się wraz z końcem pliku użyłem warunku !plik.eof() . Po włączeniu programu pętla wykonywała się w nieskończoność i program zaciął się. Zmieniłem na plik.good() - to samo. Z problemem się już uporałem bo pierwsza linijka plik zawierała liczbę z ilością osób więc mogłem przypisać ją do inta (po konwersji ze stringa) i na jej podstawie prostym rachunkiem

1 + 2 * ilosclini wyliczyć kiedy pętla ma się skończyć więc wiem, że z plikiem i instrukcjami w pętli wszysko jest ok. Mój nauczyciel z gimnazjum mówił, że błąd zawsze jest po stronie programisty, ale teraz to już zwątpiłemsmiley.

Oto dziłający kod :

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <sstream> //Konwersja stringa na int

using namespace std;

struct dane
{
  string nazwisko ;
  int wplata ;
};

int main()
{
   fstream plik ;
   plik.open("plik.txt" , ios::in) ;
   if (plik.good() == false)
   {
    cout << "ERROR" << endl << "Wylaczenie awaryjne." << endl ;
    exit(0) ;
   }

   string linia ;
   getline(plik , linia) ;
   int i ;
   istringstream is(linia) ;   // Konwersja stringa na int
   is >> i ;

   dane * tablica = new dane [i] ;
   for (int a = 0 ; a < i ; a++)
   {
    tablica[a].wplata = 0 ;
   }

   int b = 0 ;
   string linijka ;
   int x ;

   while ( b != i )
   {
     getline(plik , tablica[b].nazwisko) ;
     getline(plik , linijka) ;
     x = 0 ;
     istringstream iss (linijka) ;
     iss >> x ;
     tablica[b].wplata = x ;
     b++ ;
   }

   for (int i = 0 ; i < 4 ; i ++ )
   cout << tablica[i].nazwisko << endl << tablica[i].wplata << endl ;

   plik.close() ;
   cout << endl << endl ;
    return 0;
}

Wystarczy zamienić b != i na !plik.eof() i się sypie a nie powinno (wedle mojej wiedzy).

2 odpowiedzi

0 głosów
odpowiedź 5 sierpnia 2015 przez sZRAMEK Nowicjusz (200 p.)
U mnie na zpreparowanym txt kod dziala bez problemu. Morze podaj plik txt na ktorym kod sie wysypuje bo ciezko rozwiazywac problem ktorego nie ma :)
komentarz 5 sierpnia 2015 przez kmieciak_m Mądrala (7,450 p.)
Pomogłeś mi bardzo kiedy napisałeś podaj plik txt. Skłoniło nie to do myślenia, że może z nim jest coś nie tak i przypomniałem sobie, że ten plik był wcześniej skopiowany z innego folderu. Nie wiem dlaczego to spowodowało złe działanie programu, ale utworzenie nowego pliku i przepisanie ręcznie danych pomogło. Teraz warunek !plik.eof() działa jak należy.
komentarz 5 sierpnia 2015 przez sZRAMEK Nowicjusz (200 p.)
Jeżeli nie masz tam jakichś bardzo tajnych danych mógłbyś wrzucić ten plik który nie działa. Chętnie zobaczyłbym dlaczego program nie działa w tym konkretnym przypadku.
komentarz 5 sierpnia 2015 przez kmieciak_m Mądrala (7,450 p.)

Był to po prostu plik .txt ( z notatnika) Oto treść: 

4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000
 

Na potrzeby zadania 

"Ponownie wykonaj ćwiczenie 6 ale tym razem informacje mają być odczytywane z pliku. Pierwszy zapis w pliku to liczba donatorów dalej wiersze są ułożone parami: pierwszy wiersz pary zawiera nazwisko daroczyńcy, drugi zawiera wysokość wpłaty" 

Treść zadania 6 :  
"Przygotuj program sledzacy wplywy na konto Towarzystwa na Rzecz Zachowania Dobrych Wplywow. Uzytkownik ma byc pytany o liczbe wplacajacych, a nastepnie ma prosic o podanie wplaty kazdego donatora. Informacje nalezy umiescic w dynamicznie alokowanej tablicy struktur. Kazda struktura ma miec dwa pola: tablice znakowa (lub obiekt klasy string) na nazwisko oraz pole typu double na kwote. Po odczytaniu wszystkich danych program ma pokazac nazwiska i wplaty wszystkich, ktorzy dali przynajmniej 10000. Lista ta ma miec naglowek Nasi Wspaniali Sponsorzy. Dalej program ma pokazac liste pozostalych ofiarodawcow, tym razem z naglowkiem Nasi Sponsorzy" 

0 głosów
odpowiedź 22 sierpnia 2020 przez tothk2a11 Początkujący (290 p.)
edycja 22 sierpnia 2020 przez tothk2a11

Podepnę się pod temat.

while(!plikO.eof())

 Użycie powyższego warunku końca pętli powoduje błąd podczas kompilacji. 


-------------- Build: Debug in odrzucLiczby (compiler: GNU GCC Compiler)---------------

g++.exe  -o bin\Debug\odrzucLiczby.exe obj\Debug\main.o   
D:/Programy - pliki instalacyjne/codeblocks-20.03mingw-32bit-nosetup/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot open output file bin\Debug\odrzucLiczby.exe: Permission denied
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
2 error(s), 0 warning(s) (0 minute(s), 0 second(s))
 

Czym może to być spowodowane???
 

 

komentarz 22 sierpnia 2020 przez Michałełe Nałogowiec (25,600 p.)

Gratuluję za odkopanie tematu sprzed 5 lat :D

cannot open output file bin\Debug\odrzucLiczby.exe: Permission denied

Zmień ustawienia dostępu do pliku

komentarz 22 sierpnia 2020 przez tothk2a11 Początkujący (290 p.)
Dzięki za szybką odpowiedz, ale nie bardzo wiem gdzie wprowadzić te zmiany.
komentarz 22 sierpnia 2020 przez tothk2a11 Początkujący (290 p.)

Dzięki za linka, przy okazji załatwię jeszcze jeden problem z kilkoma plikamiyes.

Podobne pytania

0 głosów
3 odpowiedzi 348 wizyt
0 głosów
2 odpowiedzi 258 wizyt
pytanie zadane 4 listopada 2016 w C i C++ przez vega Użytkownik (510 p.)
0 głosów
3 odpowiedzi 967 wizyt

92,575 zapytań

141,424 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...