[C++] tablica elementów z pliku, wczytania do tablicy


(Kornicameister) #1

miałem podobny wątek, tylko że wtedy nie obchodziło mnie, czy dane które zostaną wczytane do pliku będą ułożone w tablicy(wektorze) liniowo, czy też dokładnie jak w tablicy dwu-wymiarowej wierszami i kolumnami, ale teraz potrzebuję tak wczytać dane, żeby ułożone zostały one w tablicy po której mógłbym operować

wczytania -> jedna liczba -> jedna komórka tablicy

#include 

#include 


using namespace std;


int main()

{

	//-----wczytanie tablicy-----/

	fstream grid;

	char *bufor;

	int dlugosc_pliku;

	grid.open("test.txt", fstream::in);


	grid.seekg (0, fstream::end);

	dlugosc_pliku=grid.tellg();

	grid.seekg (0, fstream::beg);


	bufor = new char [dlugosc_pliku];


	grid.read (bufor,dlugosc_pliku);


	grid.close();

	//-----koniec wczytywania tablicy----/

	//-----testowe wypisanie---/

	cout.write (bufor,dlugosc_pliku);

	//-----koniec testowego wypisania---/

	delete []bufor;

	}

wczytałem to blokiem, oczywiście udało się wczytać całość, ale powstał problem... jak operować po bloku, czy możliwa jest operacja żeby ten blok "poszatkować" ? zawartość pliku

01 02 03

04 05 06

07 08 09

([alex]) #2

Do tego użytecznym może być stringstream;

Wczytaj wiersz do string'a, stwórz stringstream, wczytaj kolumny ze stringstream'a.


(Kornicameister) #3

wczytać wiersz przy użyciu getline ?

pytam, bo na

http://www.cplusplus.com/reference/iostream/istream/getline/

getline jest dosyć kiepsko opisany

http://kursy.ddt.pl/?LessonId=110

tu co prawda, lepiej, ale nie wiele rozumiem z tego, no ale cóż popróbuję


([alex]) #4

Nie ten getline ciebie interesuje ten


(Kornicameister) #5

oj... ciężko się trochę w tym połapać :confused:

znaczy ten getline, który mi podałeś jest typowo do stringów, a ten który ja podlinkowałem jest do ?


(Quentin) #6

Czyli ten getline wstawia znaki ze strumienia wejściowego do tablicy znakowej (przechowuje je jako C-stringi).


(Kornicameister) #7
#include 

#include 

#include 

#include 


using namespace std;


int main()

{

	string testowy;

	fstream testowy_plik;

	testowy_plik.open("test.txt", fstream::in);


	getline(testowy_plik,testowy);


	testowy_plik.close();


	stringstream testowy_2(stringstream::in); //utworzenia stingstreama

	testowy_2<
	int test_grid[3];

	int liczba;

	for(int i=0;i<3;i++)

	{

		testowy_2>>liczba;

		test_grid[i]=liczba;

		}

	cout<
	}

zrobiłem coś takiego, ale zwraca zawartość tego pierwszego wiersza jako

0 0 0

czyli coś gdzieś zrobiłem źle


([alex]) #8

zamiast:

stringstream testowy_2(stringstream::in); //utworzenia stingstreama

testowy_2<

daj:

stringstream testowy_2(testowy,stringstream::in);

dalej tak samo.

Z tym że jeżeli wiesz ile masz kolumn w wierszu to wystarczy:

int test_grid[4][3];

for(int y=0;y<4;++y) for(int x=0;x<3;++x) testowy_plik>>test_grid[y][x];


(Kornicameister) #9

explicit stringstream ( const string & str,

                        openmode which = ios_base::out|ios_base::in );

czyli to z czego tworzę stringstrima, musi zostać użyte jako "parametr" (nie jestem pewien czy dobrej nazwy użyłem) -- Dodane Pn lut 08, 2010 10:32 pm -- to zostało mi do zrobienia, żeby wczytywal konkretną ilość wierszy, czyli tutaj 3, bo podany przeze mnie kod (no i zmieniony trochę) działa dla tylko jednego wiersza... bo ten getline wczytuje z pliku aż napotka

'\n'

... czyli koniec linii, a czy zadziałoby jakby dać na koniec ostatniego wiersza jakiś znak i kazać mu wczytywać do tego znaku i potem przerobić na tablicę ?