Wczytywanie z pliku do vectora nieznanej liczby elementów

0

Witam ! Piszę program i potrzebuję wczytać dane z pliku(liczby zmiennoprzecinkowe) do tablicy, postanowiłem użyć do tego vectora. Używam Visuala C++ Express 2010.

Mój fragment kodu w którym kompilator wskazuje błąd:

vector<float> liczbaVEC;
vectorSize= 0;
 liczbaVEC.resize(vectorSize);
	for(int i= 0; plik; i++){
		liczbaVEC.resize(liczbaVEC.size()+1);
		plik>>liczbaVEC[i];
	}

Kompilator ma chyba pretensje przy każdej kolejnej wartości.
Bardzo proszę o jakieś sugestie, co sprawdzić, jak to rozwiązać.

3
vectorSize= 0;
 liczbaVEC.resize(vectorSize);

Niepotrzebny kod

    for(int i= 0; plik; i++){
        liczbaVEC.resize(liczbaVEC.size()+1);
        plik>>liczbaVEC[i];
    }

Lepiej po prostu użyć vector<>::push_back. Dodatkowo ostatni element wektora zawsze będzie zerem. Lepiej napisz to tak:

float val;
while(plik >> val){
    liczbaVEC.push_back(val);
}

albo zastąp jednolinijkowcem:

copy(istream_iterator<float>(plik), istream_iterator<float>(), back_inserter(liczbaVEC));

Przy okazji: jeśli otrzymujesz jakiś błąd to zechciej go przytoczyć.

0

więc komunikat o błędzie pojawia się taki:

Unhandled exception at 0x7752c42d in Zyroskop.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x003ff40c..

Jak ten fragment kodu wygląda w porządku to może gdzieś dalej jest błąd:

	rollVEC.resize(liczbaVEC.size()/12);
	pitchVEC.resize(liczbaVEC.size()/12);
	yawVEC.resize(liczbaVEC.size()/12);
	int j= 0;

	for(int i= 0; i<liczbaVEC.size()-1; i++){
		switch(i%12){
			case 0:
				rollVEC[j]=liczbaVEC[i];
				break;
			case 1:
				pitchVEC[j]=liczbaVEC[i];
				break;
			case 2:
				yawVEC[j]=liczbaVEC[i];
				j++;
				break;
			default:
				break;
		}
	}

wszystkie te vectory przyjmują elementy typu float

dodanie znacznika <code class="none"> dla treści błędu - @furious programming

0

bad_alloc musi być gdzieś w alokacji, gdzieś musisz mieć błąd z resize, new, push_back albo inną funkcją, która może powodować alokację.

0

Jest ogólnie trochę lepiej gdy zastosowałem tą pętlę

 for(int i= 0; plik; i++){
        liczbaVEC.resize(liczbaVEC.size()+1);
        plik>>liczbaVEC[i];
    } 

(Dzięki za to!)

Program teraz się uruchamia, pracuje, robi swoje ale na sam koniec wyskakuje błąd:
Second Chance Assertion Failed: File c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector, Line 932
Zyroskop.exe has triggered a breakpoint

A także otwiera mi się w Visualu plik: dbgrptt.c
i żółta strzałeczka pokazuje na ten fragment:

_CRTIMP void _cdecl _CrtDbgBreak(
    void
    )
{
    __debugbreak();
} 
0

Już działa.
Choć nie mam pojęcia na czy polegał błąd i jak to teraz działa.

ten fragment kodu używa zmiennej iStep:

	if(rollVEC[iStep]<0){
		graphics.DrawRectangle(&pen, SRODEK_PASKOW+(int)rollVEC[iStep], 300, -(int)rollVEC[iStep], 20);
	}else graphics.DrawRectangle(&pen, SRODEK_PASKOW, 300, (int)roll, 20);
	if(pitchVEC[iStep]<0){
		graphics.DrawRectangle(&pen,SRODEK_PASKOW+(int)pitchVEC[iStep],350, -(int)pitchVEC[iStep], 20);
	}else graphics.DrawRectangle(&pen, SRODEK_PASKOW, 350, (int)pitchVEC[iStep], 20);
	if(yawVEC[iStep]<0){
		graphics.DrawRectangle(&pen, SRODEK_PASKOW, 400, -(int)yawVEC[iStep], 20);
	}else graphics.DrawRectangle(&pen, SRODEK_PASKOW, 400, (int)yawVEC[iStep], 20); 

A teraz to fragment kodu który nie działa !

	case WM_TIMER:
		switch (wParam)
		{
		case TMR_1:
			//force window to repaint
			
			repaintWindow(hWnd, hdc, ps, &drawArea2);
			if(iStep <(liczbaVEC.size()/12)){
				iStep++;
			}
			value++;
			break;
		} 

Oraz zmiana po której kod działa:

			//force window to repaint
			
if(iStep <(liczbaVEC.size()/12)){
	 repaintWindow(hWnd, hdc, ps, &drawArea2);
	iStep++;
}
value++; 

teraz zauważyłem, że po prostu próbowałem odczytać zbyt odległy element vectora

if(iStep <((liczbaVEC.size()/12)-1)) 

odjęcie 1, pomaga rozwiązać problem. Takie błahe, a tyle można się namęczyć.

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