• 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() )

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
3,950 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 464 wizyt
0 głosów
2 odpowiedzi 318 wizyt
pytanie zadane 4 listopada 2016 w C i C++ przez vega Użytkownik (510 p.)
0 głosów
3 odpowiedzi 1,326 wizyt

93,195 zapytań

142,211 odpowiedzi

322,058 komentarzy

62,519 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 3316p. - dia-Chann
  2. 3251p. - Łukasz Piwowar
  3. 3243p. - Łukasz Eckert
  4. 3222p. - CC PL
  5. 3167p. - Tomasz Bielak
  6. 3157p. - Łukasz Siedlecki
  7. 3133p. - rucin93
  8. 3110p. - Maurycy W
  9. 3028p. - Adrian Wieprzkowicz
  10. 2992p. - Mikbac
  11. 2490p. - Marcin Putra
  12. 2467p. - Michał Telesz
  13. 2427p. - Michal Drewniak
  14. 2372p. - Anonim 3619784
  15. 1949p. - rafalszastok
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...