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

Jak wczytać plik.txt do tablicy Vektor ?

Object Storage Arubacloud
0 głosów
626 wizyt
pytanie zadane 1 czerwca 2015 w C i C++ przez Barbas Nowicjusz (120 p.)
edycja 1 czerwca 2015 przez Barbas
Piszę obiektowo projekt: Quiz. Pytania z różnych kategorii są w różnych plikach tekstowych. Mam teraz za zadanie wgrać te właśnie pytania do tablicy vektor, żeby mieć do nich wszytkich swobodny dostęp. W plikach jedna linia to pytania, potem możliwe odpowiedzi a na końcu prawidłowa.
Takie dostałem rady od wykładowcy, wydaje mi się to logiczne ale nie wiem jak to napisać w kodzie.

Ktoś mi coś poradzi ?

3 odpowiedzi

+1 głos
odpowiedź 1 czerwca 2015 przez draghan VIP (106,230 p.)
Najbardziej przejrzyście byłoby stworzyć klasę pytania, która zawierałaby komplet danych dla jednego pytania w quizie, a więc treść, możliwe odpowiedzi i informację o tej poprawnej.

Zainteresuj się klasą ifstream z std. :) Masz tam m.in. funkcję getline, która mogłaby znacznie ułatwić Ci rozwiązanie Twojego problemu. :)

Ewentualnie funckja getline dla std::string: http://www.cplusplus.com/reference/string/string/getline/

Powodzenia! :)
komentarz 1 czerwca 2015 przez Barbas Nowicjusz (120 p.)
Dzięki wielkie ;)

Użyłem właśnie tej funkcji, program działa losuje pytania, wszytko okej. Ale chciałbym wgrać wszystkie pytania na raz i z wektora brać po jednym. Bardziej optymalny kod i wyższa ocena ;)
komentarz 1 czerwca 2015 przez draghan VIP (106,230 p.)

W takim wypadku sugestia użytkownika hit02 jest trafiona. :)

Z tym, że będziesz musiał samodzielnie parsować swoje pliki. :) Ale to chyba nie jest problem...? ;)

Popatrz na std::ifstream.read() - funkcja służy do pobierania bloku danych. http://www.cplusplus.com/reference/istream/istream/read/

0 głosów
odpowiedź 1 czerwca 2015 przez Bartek85 Mądrala (7,440 p.)
Mało precyzyjne pytanie. Jaka jest struktura pliku? co chcesz wczytywać? znany jest rozmiar elementów w pliku? Pamiętaj, że na tym forum nie ma wróżek i nie wiedza jaki masz problem. Opisz swój problem w taki sposób, aby ktoś kto nie siedzi w Twojej głowie to zrozumiał i był w stanie Ci pomóc.
komentarz 1 czerwca 2015 przez Bartek85 Mądrala (7,440 p.)

Użytkownik draghan ma rację. Najlepsza impelemntacja będzie taka jak zapropononował. Poniżej wklejam, przykładowe rozwiązanie:

#include <iostream>
#include <vector>
#include <fstream>
#include <string>

class Question
{
private:
	bool _isInitialized;
	std::vector<std::string> _data;

	bool Load(char* fileName)
	{
		bool result = false;		

		std::ifstream file(fileName);
		if (!file.is_open())
			return false;

		std::string tmp;
		while (getline(file, tmp))
			_data.push_back(tmp);

		file.close();
		return true;
	}

public:
	Question(char* fileName = "")
	{
		_isInitialized = Load(fileName);
	}

	const std::string& GetQuestion() const
	{
		if (!_isInitialized)
			throw std::exception("Object is not initialized.");
		if (_data.empty())
			throw std::exception("Object is has incorrect data.");
		return _data.at(0);		 
	}

	std::vector<std::string> GetAnswers() const
	{
		if (!_isInitialized)
			throw std::exception("Object is not initialized.");
		if (_data.size() < 1)
			throw std::exception("Object is has incorrect data.");
		return std::vector<std::string>(_data.begin() + 1, _data.end());			
	}
};

void DisplayQuestion(const Question& q)
{
	int numberOfAnswer = 1;
	std::cout << q.GetQuestion() << std::endl;
	const std::vector<std::string>& vec = q.GetAnswers();
	for (std::string s : vec)
		std::cout << numberOfAnswer++ << ". " << s << std::endl;
}

int main()
{
	try
	{
		Question q("test.txt");
		DisplayQuestion(q);
	}
	catch (std::exception e)
	{
		std::cerr << "Error during load or display Question. Internal messgae=" << e.what() << std::endl;
	}

	getchar();
}

Nie wiem na jakim systemier operacyjnym pracujesz, w związku z czym nie napisałem funkcji która przeszukuje wszytskie pliki z danym katalogu. Jakbyś to zrobił(albo jak będziesz miał kłopot to daj znać, to tez pomoge), to możesz wczytać za jednym zamachem wszytskie pliki do wektora z typami Question, a następnie to już możesz losować i generalnie robić co tylko chcesz. Jakbyś miał jakies pytania, to pytaj smiało.

0 głosów
odpowiedź 1 czerwca 2015 przez hit02 Nałogowiec (33,970 p.)
Może trochę nie na temat, ale czy nie lepiej sprawdzić rozmiar pliku i zaalokować odpowiednią ilość pamięci? Będzie to prostsze i szybsze.
komentarz 1 czerwca 2015 przez Bartek85 Mądrala (7,440 p.)
Latwiejsze? i szybsze? Nie znając problemu nie wiadomo co jest dobre a co złe. Ja bym sie wstrzymał do czasu aż autro zechce sie z nami podzielić problemem, a nie tylko jego strzępami :)
komentarz 1 czerwca 2015 przez Barbas Nowicjusz (120 p.)
Nakreśliłem mniej więcej problem, wystarczająco jasno ?

Podobne pytania

0 głosów
1 odpowiedź 389 wizyt
pytanie zadane 3 stycznia 2017 w C i C++ przez Mateusz1223 Bywalec (2,440 p.)
0 głosów
1 odpowiedź 578 wizyt
pytanie zadane 30 lipca 2020 w PHP przez Bakkit Dyskutant (7,600 p.)
0 głosów
2 odpowiedzi 758 wizyt

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

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

...