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

getline nie czyta po spacji

Object Storage Arubacloud
0 głosów
349 wizyt
pytanie zadane 14 grudnia 2015 w C i C++ przez dichloroetylobenzen Użytkownik (850 p.)

Hej, muszę wczytać dane z pliku do tablicy, zrobiłam w ten sposób, ale ucina mi wyrazy po spacji, np gdy nazwa składa się z dwóch wyrazów. Oto kod: 

struct Kot
{
    char imie[10];
    char rasa[20];
    int wiek;
    float waga;
};

void wczytaj(char nazwa[],Kot *X)
{
ifstream plik(nazwa);
string wiersz;
for(int j=0; j<8; j++)
{
plik>>X[j].imie;
getline( plik, wiersz );
plik>>X[j].rasa;
getline( plik, wiersz );
plik>>X[j].wiek;
getline( plik, wiersz );
plik>>X[j].waga;
getline( plik, wiersz );
}
}

Podpowie ktoś co zmienić ? 

2 odpowiedzi

+3 głosów
odpowiedź 14 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)
wybrane 14 grudnia 2015 przez dichloroetylobenzen
 
Najlepsza

Pozwolę sobie skomentować co robi ta pętla:

for(int j=0; j<8; j++)
{
plik>>X[j].imie; // 1
getline( plik, wiersz ); // 2
plik>>X[j].rasa; // 3
getline( plik, wiersz ); // 4
plik>>X[j].wiek; // 5
getline( plik, wiersz ); // 6
plik>>X[j].waga; // 7
getline( plik, wiersz ); // 8
}

1. wczytaj wyraz do tablicy znaków (wczyta max 9 znaków)
2. wczytaj resztę wiersza do stringa "wiersz"
3. wczytaj wyraz do innej tablicy znaków (wczyta max 19 znaków)
4. wczytaj resztę wiersza nadpisując poprzednią wartość stringa "wiersz" (jeżeli uprzednia operacja wczytania (rasa) wczytała cały wiersz, to getline() wczyta cały wiersz następny)
5. wczytaj liczbę do zmiennej wiek
... i tak dalej....

Dużo zależy od tego jak skonstruowałaś swój plik. Jeżeli plik wygląda mniej więcej tak:
"Dane.txt"
Pan Garfield
Pers
9
10

A Ty chciałabyś wczytać te dane, to kilka uwag:
- imię i rasę najlepiej przechować w stringu
- dane wczytujesz tak:
 

getline( plik, X[ j ].imie );
getline( plik, X[ j ].rasa );
plik >> X[ j ].wiek;
plik >> X[ j ].waga;

Stosując się do powyższych zaleceń powinno się udać. Nie wiem jednak jak wygląda dokładnie struktura pliku, który chcesz odczytać, więc nie mogę powiedzieć na pewno, że to zadziała. Jeżeli nadal nie zadziała, to pokaż jak wygląda plik, który chcesz odczytać :-)

komentarz 14 grudnia 2015 przez dichloroetylobenzen Użytkownik (850 p.)
chodzi o to, że to zadanie na uczelnie gdzie jesteśmy "smutni" więc mamy używać charów bo stringi są za przyjemne ;)

tak, struktura mojego pliku wygląda mniej wiecej tak jak pokazałeś w przykładzie i własnie przez te chary dalej nie wiem jak to ugryźć, ale dzięki za przeanalizowanie pętli :)
komentarz 14 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)
edycja 14 grudnia 2015 przez Sebastian Fojcik

Ahh, nie wiedziałem, że jesteście 'smutni' ;C

Przepraszam, że tak późno odpowiadam, ale jeszcze aktualne, prawda? :-)

Otóż aby wczytać cały wiersz do tablicy znaków łącznie ze spacjami, piszemy tak:

plik.getline( nazwa_tablicy, rozmiar_tablicy );

W Twoim przypadku będzie to:

plik.getline( X[ j ].imie, 10 );
plik.getline( X[ j ].rasa, 20 );
plik >> X[ j ].wiek;
plik >> X[ j ].waga;

Teraz nie będziesz musiała "oszukiwać" i używać stringów :-) W ogóle nie będą Ci teraz potrzebne (Matko, jak to musi brzmieć dla nie-programisty XD)

Teraz jak dopiero zrozumiałem problem, to mogłem pomóc. Mam nadzieję, ze skutecznie. Jeśli nadal coś niejasne, to śmiało pytaj ;-)
yes

PS. Polecam jeszcze zwiększyć rozmiar tablic. 9 znaków na imię dla kiciucha, to trochę mało, nie uważasz? :-P

komentarz 14 grudnia 2015 przez dichloroetylobenzen Użytkownik (850 p.)
nie, nie za późno, przecież programiści nie śpią :D

dzięki, teraz działa jak chciałam ! :)
+1 głos
odpowiedź 14 grudnia 2015 przez Tomekku Bywalec (2,830 p.)

Mam jeszcze jedno rozwiązanie, mianowicie przez referencję, wtedy nie potrzeba używać pętli, tylko w przypadku liczb użyłem funkcji atoi() i atof() z biblioteki <cstdlib>

void wczytaj(char nazwa[],Kot &X)
{
	ifstream plik(nazwa);
	string wiersz;
	getline( plik, wiersz );
	X.imie = wiersz;
	getline( plik, wiersz );
	X.rasa = wiersz;
	getline( plik, wiersz );
	int i = atoi(wiersz.c_str());
	X.wiek = i;
	getline( plik, wiersz );
	float j = atof(wiersz.c_str());
	X.waga = j;
	plik.close();
		
}

nie ma wtedy także problemu ze spacjami :D

EDIT:

Zapomniałem dodać, że w strukturze użyłem stringów :D

Podobne pytania

0 głosów
1 odpowiedź 1,061 wizyt
pytanie zadane 3 stycznia 2016 w C i C++ przez agre Użytkownik (550 p.)
0 głosów
2 odpowiedzi 724 wizyt
pytanie zadane 11 czerwca 2017 w C i C++ przez TomaszA2 Obywatel (1,720 p.)
0 głosów
1 odpowiedź 400 wizyt
pytanie zadane 29 grudnia 2016 w C i C++ przez czujek22 Dyskutant (7,670 p.)

92,555 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,941 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!

...