Wczytywanie z pliku.

0

Witam mam takie zadanie.

Do tablicy T[n] (n – stała) rekordów o polach (miasto, godzina, minuta) wczytać dane z pliku „odjazdy.txt”, a następnie:

wydrukować dane o wszystkich odjazdach po godzinie 17:20
wydrukować nazwę miasta, do którego można odjechać najwcześniej (najmniejsza wartość godziny z odpowiadającą jej najmniejszą wartością minut)
wydrukować informację, do ilu miast można odjechać przed godziną 12:00.

Mam problem z wczytanie danych z pliku. Plik umieszczony jest w w tym samym katalogu co plik main.cpp
Oto kod:

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>

using namespace std;

const int n = 5;
 
struct rozklad {
	string miasto;
	int godzina;
	int minuta;
};

int main() {

	rozklad t[n];
	int odjazdy_po_17 = 0;
	int odjazdy_przed_12 = 0;
	int licznik = 0;



	ifstream plk;
	plk.open("dane.txt");
	if (!plk.good()) {
		cout << "Porbelm z otwarciem pliku\n";
		return 1;
	}
	while (!plk.eof()) {
		for (int i = 0; i < n; i++) {
			plk >> t[i].miasto;
			plk >> t[i].godzina;
			plk >> t[i].minuta;
		}
		
		
	}

	for (int i = 0; i < n; i++) {
		cout << "miasto: " << t[i].miasto << "  godzina:  " << t[i].godzina << "  minuta:  " << t[i].minuta;
	}

	return 0;
}

niestety dla mnie nic się nie wczytuje.

Dane w pliku zapisane są następująco:
miasto
godzina
minuta
miasto
godzina
minuta
...
...
...

Podpowiecie co robię źle??

0

Podejrzewam, że masz jakiś błąd składniowy w pliku dane.txt. Na przykład zamiast **zera **jest gdzieś litera o.

0
ifstream plk("dane.txt");
if(plk)
{
    size_t cnt=0;
    while((cnt<n)&&(plk>>ws>t[cnt].miasto>>t[cnt].godzina>>t[cnt].minuta) ++cnt;
    for(size_t i=0;i<cnt;++i) cout<<"miasto: "<<t[i].miasto<<"; godzina: "<<t[i].godzina<<"; minuta: "<<t[i].minuta<<endl;
}
else
{
    cout<<"Porbelm z otwarciem pliku"<<endl;
    return 1;
}

0

Niestety ale to rozwiązanie nie pomogło. Ma ktoś jakiś pomysł jak rozwiązać ten problem.

0
TomaszLiMoon napisał(a):

Podejrzewam, że masz jakiś błąd składniowy w pliku dane.txt. Na przykład zamiast **zera **jest gdzieś litera o.

W pliku wszystkie dane są poprawnie wpisane.

2

use debugger, Luke

0

W pliku wszystkie dane są poprawnie wpisane

  1. Pokaż plik dane.txt.
  2. Co pojawia się w **konsoli **po uruchomieniu programu?
0

Debugger nic nie pokazuje.
Program się normalnie kompiluje, niestety okno konsolowe jest puste. Wiec albo nic się nie wczytuje z pliku albo co mniej prawdopodobne pętla for dla wypisania wyników wczytywania jest do bani.

screenshot-20200827213543.png

2
infinity100 napisał(a):

Debugger nic nie pokazuje.

Serio? Debuger się też popsuł? Weź zatrzymaj się w tej pętli i sprawdź ją krok po po kroku. Pewnie nieskończona ;)
Nie wiem po co ci ten while, skoro masz już for, który zaczyna zawsze od 0.

0
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;

struct { string city; int h,m; } t[1000];
const size_t MaxCount=sizeof(t)/sizeof(*t);

int main()
{
	ifstream fin("C:\\APP\\Bcc\\Test\\data.txt");
	if(fin)
	{
	    size_t cnt=0;
	    while((cnt<MaxCount)&&(fin>>ws>>t[cnt].city>>t[cnt].h>>t[cnt].m)) ++cnt;
	    for(size_t i=0;i<cnt;++i) cout<<setfill('0')<<setw(2)<<t[i].h<<':'<<setfill('0')<<setw(2)<<t[i].m<<'\t'<<t[i].city<<endl;
	}
	else
	{
	    cout<<"Porbelm z otwarciem pliku"<<endl;
		return 1;
	}
	return 0;
}

C:\APP\Bcc\Test>type data.txt
Gdansk
15
30
Opole
10
20
Warszawa
13
00
Krakow
8
30
Poznan
20
00

C:\APP\Bcc\Test>rozklad_jazdy.exe
15:30   Gdansk
10:20   Opole
13:00   Warszawa
08:30   Krakow
20:00   Poznan
1

Program się normalnie kompiluje, niestety okno konsolowe jest puste

Zobacz co powinna pokazywać konsola.
W normalnej sytuacji : https://wandbox.org/permlink/GFDlfM8XvZZnae4L
W przypadku nie znalezienia pliku : https://wandbox.org/permlink/Cv7X3yI5msBDFHts
Kiedy wprowadzane dane nie będą prawidłowe : https://wandbox.org/permlink/cYkAMpUehj2XTJZb (*)

(*) Chodzi o sytuację w której do liczby całkowitej następuje próba wczytania tekstu nie będącego liczbą. W tym przypadku w pętli while dodany został warunek sprawdzający sprawdzania poprawność wczytania danych.

0

Jeżeli próbujesz najpierw wypisać dane z pliku, żeby zobaczyć, czy w ogóle wszystko działa (przynajmniej to zrozumiałem z twojego postu, bo w kodzie nie ma żadnych obliczeń, aby wypisać, np. te odjazdy po 17:20), to musisz wypisywać od razu w pętli while, np. tak:

    while (!plk.eof()) {
         for (int i = 0; i < n; i++) {
            plk >> t[i].miasto;
            cout << t[i].miasto << "\n";
            plk >> t[i].godzina;
            cout << t[i].godzina << "\n";
            plk >> t[i].minuta;
            cout << t[i].minuta << "\n";
         }
    }

Jeżeli wczytujesz dane z pliku do plk, to musisz je od razu wypisać, inaczej je ciągle nadpisujesz. Nie potrafię wyjaśnić jakoś technicznie tego, co u ciebie nie działa, a nie chcę mieszać "intuicyjnie", "na chłopski rozum" albo jak inaczej to nazwiesz.
Chyba będzie prościej zrozumieć to, co się dzieje, w taki sposób:

    string linia;
    while (!plk.eof()) {
       getline (plk, linia);
       cout << linia << "\n";
    }

Odczytujesz kod linia po linii, co 3 linie możesz je wpisać do jednego stringa, wcześniej oddzielając odpowiednimi znakami (spacjami, dwukropkami czy co będziesz chciał).
Ktoś tam się wyżej pospieszył i napisał ci rozwiązanie, ale teraz już raczej poradzisz sobie sam.

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