Kopiowanie danych ze strumienia nazw (stringstream) do różnych zmiennych

0

Mam plik (binarny) zawierający :

35; (CRLF)
**AUDI; Q3;2009;2.5 ; 120000 ; **(CRLF)
**VW ; Golf; 2010 ; 2.0 TDI ;58000 ** (CRLF)
VW ; Polo; 2010 ; 1.6 ;43000 (CRLF)

Czytam go do strumienia:

std::stringstream ssOdczytanyPlik

.
Wypełniony strumień zawiera typowe informacje o aucie( marka, model, rok prod., pojemność, cena)
oddzielone średnikiem ,a informacje o modelu kończą się znakiem '\n'.

Pytanie 1 - w jaki sposób mógłbym odczytać pierwszą liczbę 35 ?
Pytanie 2 - w jaki najbardziej optymalny sposób odczytywać poszczególne elementy strumienia tj. informacje o aucie( marka, model, rok prod., pojemność, cena) odzielone w strumieniu znakiem ';'

string Nazwa  <<  ssOdczytanyPlik   ??? 
string Model  <<  ssOdczytanyPlik  ???
int Rok <<  ssOdczytanyPlik  ???

Najprymitywniejsza metoda to liczenie średników i znaków końca linii '\n' tylko zastanawiam się jak wykorzystać cechę strumieni i w bardzo prosty i optymalny sposób wyłuskiwać poszczególne dane i kopiować jest do różnych zmiennych?

0

Poczytaj pierwszy lepszy kurs jaki znajdziesz w googlach (przynajmniej pierwsze parę stron):

ifstream fin("MojNibyBinarnyPlikTekstowy.txt");
char separator;
int count;
fin>>count>>ws>>separator;
string Nazwa,Model,Silnik;
int Rok,Przebieg;
for(int i=0;i<count;++i) fin>>ws>>Nazwa>>ws>>separator>>ws>>Model>>ws>>separator>>ws>>Rok>>ws>>separator>>ws>>Silnik>>ws>>separator>>ws>>Przebieg;
0

Dziękuję bardzo.

  1. Dlaczego strumień z "białymi spacjami" ekstrahowany **nie wywala **błędu : (/)
	std::string sStr1, sStr2, sStr3;
	int  iNr1, iNr2, iNr3;
	istringstream isStream("TEXT ; 9");
	
	isStream 
		//>>  skipws 
		>>  sStr1  >> cSeparator
		>>  iNr1 ;
	
	if(isStream.fail()) cout << "Error in Parsing !" << endl;
	
	else
	{
		
		cout	<< "\n\nParsed items: " << endl 
				<< sStr1				<< endl 
				<< iNr1					<< endl;
			
	}
  1. a bez "ws" ** zgłasza błąd **?
std::string sStr1, sStr2, sStr3;
	int  iNr1, iNr2, iNr3;
	istringstream isStream("TEXT;9");;
	
	isStream 
		//>>  skipws 
		>>  sStr1  >> cSeparator
		>>  iNr1 ;
	
	if(isStream.fail()) cout << "Error in Parsing !" << endl;
	
	else
	{
		
		cout	<< "\n\nParsed items: " << endl 
				<< sStr1				<< endl 
				<< iNr1					<< endl;
			
	}



  1. Czy operator ekstrakcji ZAWSZE odczytuje ws tzn. , że przy ekstrahowaniu strumienia nazw jeśli nie napotka znaku "ws" to pakuje odczytywane znaki do pierwszej podanej zmiennej ( tutaj sStr1) i z wiadomych względów wywala się ?
0

Ponieważ bez ws do separatora wczytasz spacje, po czym do liczby próbujesz wczytać średnik.

0
_13th_Dragon napisał(a):

Ponieważ bez ws do separatora wczytasz spacje, po czym do liczby próbujesz wczytać średnik.

1.Chwileczkę, przecież w strumieniu

 "TEXT;9"

nie ma spacji więc skąd operator ekstrakcji (>>) pakuje mi ws do zm. cSeparator ?
Czy to znaczy, że spacje lub inny znak typu **ws **musi być w strumieniu , by **operator >> **właściwie przekierowywał znaki do odpowiednich zmiennych , a mój separator jest ignorowany?

0

Przeczytaj co robi ws lub zadaj pytanie w jakimś przyzwoitym języku, np po polsku.

0
_13th_Dragon napisał(a):

Ponieważ bez ws do separatora wczytasz spacje, po czym do liczby próbujesz wczytać średnik.

Dziękuje.
Uważam , że dość precyzyjnie jest opisana mają wątpliwość. Chciałbym zagadnienie strumieni dobrze zrozumieć, a zauważyłem , że część osób wypowiadająca się nie do końca rozumie strumienie i wprowadza w błąd.

Nie rozumiem co masz na myśli pisząc *" Ponieważ bez ws do separatora wczytasz spacje, ... " *.
Mając strumień:

"TEXT;9"

i ekstrahując go :

cout	<< "\n\nParsed items: " << endl 
				<< sStr1	<< endl 
				<< iNr1	<< endl;   

gdzie wpisuje do separatora spacje ?

0

"... precyzyjnie jest opisana mają wątpliwość." - O tak bardzą precyzjną.
"... gdzie wpisuje do separatora spacje ?" - w podanym przykładzie nic nie wpisujesz jedynie wypisujesz jakieś wartości.
Napisy strumień wczytuje do podanej długości (np przez setw) lub do podanego białego znaku.

0

Trzeba było tak od razu pisać ...

W przedostatniej swojej odpowiedzi wprowadzasz w błąd i nie odpowiadasz w niej konkretnie na zadane pytania:

  1. Przy braku w strumieniu znaków **ws **operator ekstrakcji wczytuje wszystkie znaki strumienia
"TEXT;9" 

do pierwszej zm. sStr1.
Ponieważ nie natrafia na znak **ws **wywala wartość ( śmieć) spoza zakresu strumienia:

Output: TEXT;9-858993460

  1. Odpowiedź powinna brzmieć - TAK, strumienie nazw przy ekstrahowaniu do różnych typów zm. wymagają ( oczekują) znaku ws.
    Jednak jest możliwość , by własne separatory ( np. znak ';' były traktowane jako ws). Dokładnie jest to opisane tutaj:
http://stackoverflow.com/questions/2338827/reading-formatted-data-with-cs-stream-operator-when-data-has-spaces
  1. Literówki ( mają - moją, wpisuje-wypisuje ) każdemu się zdarzają ;-)
  2. Dziękuję za poświęcony czas.
0

Punkty 1 i 2 to jakieś totalne bzdury,

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