wczytywanie danych z pliku CSV - dziwne wyniki

0

Hej, mam taki o to problem:
mam plik w formacie CSV. W pierwszej linijce zapisałem w nim ile będzie wierszy a ile kolumn pozostałych zmiennych (w kolejnych linijkach). Obecnie są to liczby 5 i 6.
Problem jest taki, że program wczytuje albo 2 razy 5 albo 5 i jakąś liczbę z kosmosu albo chyba jeszcze jakoś inaczej.
Dziwne jest również to, że jak wyświetlę pierwszą linijkę z pliku, którą pobrałem funkcją getline to zamiast pokazać 5;6 to pokazuje " ;6" - czyli spacja, średnik i 6.

Kod, który tak robi jest poniżej:

int _tmain(int argc, _TCHAR* argv[])
	{
	cout << "start " << endl;
	string file_var_name = "plik_z_danymi.csv";
	//-------
	ifstream file;
	file.open(file_var_name);
	string line;
	string var;
	int row_number;
	int column_number;

	istringstream stream_row;	//strumień dla wiersza
	istringstream stream_var;	//strumień dla zmiennej

	getline(file, line);
	cout << line << endl;	//<- tutaj pokazuje "_;6", gdzie "_" to spacja

	stream_row.str(line);

	getline(stream_row, var, ';');	//wydobywamy pierwszą zmienną
	stream_var.str(var);		//tworzymy strumień dla zmiennej
	stream_var >> row_number;		//wprowadzamy do zmiennej wartość ze strumienia
	//stream_var.clear();			

	getline(stream_row, var, ';');	
	stream_var.str(var);		
	stream_var >> column_number;
	stream_var.clear();

	cout << "row_number = " << row_number << " column_number = " << column_number << endl;
	//wynik: row_number = 5 column_number = -858993460

	cout << "------- KONIEC PROGRAMU -------" << endl;
	getchar();
	return 0;
	}

Czy mógłbym kogoś prosić o pomoc w wyjaśnieniu co jest nie tak?
Z góry bardzo dziękuję za każdą pomoc!

0

Wybieraj typy bez znakowe jeżeli nie spodziewasz się liczb ujemnych: unsigned row_number;
inicjalizuj zmienne: column_number=0;
To też wyświetli " ;6": cout<<"5;6\r "<<endl;
Patrz na kodowanie pliku.

0
_13th_Dragon napisał(a):

Wybieraj typy bez znakowe jeżeli nie spodziewasz się liczb ujemnych: unsigned row_number;
inicjalizuj zmienne: column_number=0;
To też wyświetli " ;6": cout<<"5;6\r "<<endl;
Patrz na kodowanie pliku.

Dzięki @_13th_Dragon, rzeczywiście, gdy zainicjowałem zmienne 0 (i zmieniłem na unsigned) to zniknął problem tej dużej liczby, ale w dalszym ciągu problem pozostał tzn. ciągle wyświetla się " ;6" zamiast "5;6"
Do tego wyświetla row_nubmer = 5 a column_number = 0 (czyli tą wartość zainicjowaną). Tak jakby w ogóle nie próbował pobrać tej drugiej zmiennej ;(.
Natomiast nie za bardzo rozumiem o co Ci chodziło z kodowaniem pliku i z tym fragmentem:

_13th_Dragon napisał(a):

To też wyświetli " ;6": cout<<"5;6\r "<<endl;

1

Odpal instrukcje którą podałem i zobacz co wyświetli, potem zacznij analizować plik.

0
_13th_Dragon napisał(a):

Odpal instrukcje którą podałem i zobacz co wyświetli, potem zacznij analizować plik.

Dzięki @_13th_Dragon - rzeczywiście problem leżał w "\r".
Pozbyłem się go przy pomocy erase i wyświetla mi już prawidłowo "5;6", ale ciągle column_number = 0 :( - masz jeszcze jakąś propozycję, gdzie teraz powinienem szukać rozwiązania? ;)
Z góry bardzo Ci dziękuję ;)

0
    ifstream file("plik_z_danymi.csv");
    unsigned row_number,column_number;
    char separator;
    file>>row_number>>separator>>column_number;
    cout << "row_number = " << row_number << " column_number = " << column_number << endl;
0

Czemu ludzie nie używaja debugera tylko próbują cuda na kiju robić? Odpal chłopie ten kod pod debugerem i w 30 sekund dowiesz sie co jest nie tak.

0
_13th_Dragon napisał(a):
    ifstream file("plik_z_danymi.csv");
    unsigned row_number,column_number;
    char separator;
    file>>row_number>>separator>>column_number;
    cout << "row_number = " << row_number << " column_number = " << column_number << endl;

Niestety tak również nie działa ;-(

Shalom napisał(a):

Czemu ludzie nie używaja debugera tylko próbują cuda na kiju robić? Odpal chłopie ten kod pod debugerem i w 30 sekund dowiesz sie co jest nie tak.

Ale debuger nic nie mówi ;/ - przynajmniej tak mi się wydaje (w output brak błędów i warmingów)
Jedyne w sumie co pisze i może coś znaczyć a czego kompletnie nie rozumiem to:

(Win32): Loaded 'C:\Windows\SysWOW64\msvcr120d.dll'. Cannot find or open the PDB file.

i podobne (jest 5 takich komunikatów) lub

The thread 0x2080 has exited with code -1073741510 (0xc000013a).

0

@_13th_Dragon jak nie VS to co dla początkujących?
Czy mógłbyś chociaż mnie naprowadzić na rozwiązanie tego problemu? - tak jak zrobiłeś to z "\r"-em ;)
Z góry dziękuję.

0

Da nawet DevC++ wystarczy, na początek. Przynajmniej na pierwsze kilka miesięcy nawet jeżeli jesteś geniuszem od programowania.

0

uff udało się ;-)
zrobiłem tak:

	line.erase(remove(line.begin(), line.end(), '\r'), line.end());
	line.erase(remove(line.begin(), line.end(), '\0'), line.end());
	line.erase(remove(line.begin(), line.end(), '\t'), line.end());

Jak widać siedziały tam jeszcze jakieś śmiecie...

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