Pytanie o strukture danych w pliku txt

0

Witam!
Musze napisać program pt.:"Test z informatyki". Czy taka struktura pytan w pliku bedzie poprawna ?

Winamp służy do:
odtwarzania muzyki
kompresji plików
tworzenia grafiki
szyfrowania plików
a
Winrar służy do:
tworzenia grafiki
odtwarzania muzyki
kompresji plików
tworzenia animacji
c

Te litery na koniec to poprawne odpowiedzi.

0

Jeżeli będziesz wczytywał jakąś funkcja typu getline() to jak najbardziej jest poprawna ;)

0

A ja bym to zrobił w ten sposób:

Winamp służy do:;a;odtwarzania muzyki;kompresji plików;tworzenia grafiki
Winrar służy do:;c;tworzenia grafiki;odtwarzania muzyki;kompresji plików;tworzenia animacji
  • Każda fraza oddzielona średnikami;
  • Pierwsze pole to pytanie;
  • Drugie pole to odpowiedź;
  • Reszta pól to warianty.

Dzięki takiemu rozłożeniu danych będziesz mógł zrobić różną ilość wariantów odpowiedzi i nie będzie jakoś trudno parsować dane. W Twoim przypadku parsowanie odbywa się per linijka i tak naprawdę najlepiej byłoby gdyby ilość wariantów była równa, ponieważ ciężko rozpoznać co jest czym.

W moim przykładzie:

  • Czytasz linijkę;
  • Robisz splita po średniku;
  • Uzupełniasz odpowiednie pola struktury pozycja_testu.
struct pozycja_testu
{
	string pytanie;	// split[0]
	char odpowiedz;	// split[1]
	vector<string> warianty;	// split[n]
}

I masz prosto, bez kombinowania.

0

Ja ja bym robił to bym użył JSon albo xml-a, bo takie są obecnie standardy, ale to za duża armata dla ciebie.
Rozwiązanie od grzesiek51114 jest mało czytelne i niepotrzebnie komplikuje sprawę.

Jedynie co mnie niepokoi w twoim rozwiązaniu to brak stwierdzenia, że masz ustalaną twardo ilość odpowiedzi.
Moim zdaniem lepiej by było oddzielać pytania pustą linią, a wskazanie prawidłowej odpowiedzi powinno być zaraz za pytaniem:

Winamp służy do:
a
odtwarzania muzyki
kompresji plików
tworzenia grafiki
szyfrowania plików

Winrar służy do:
c
tworzenia grafiki
odtwarzania muzyki
kompresji plików
tworzenia animacji

Lepiej to wygląda, oraz łatwiej będzie zrobić zmiany jeśli liczba możliwych odpowiedzi powinna się zmienić lub nie być stała.

0

@MarekR22: w zasadzie czemu nie? W sumie problem jest ze splitem, bo trzeba go skądś wziąć albo samemu napisać.

#include<iostream>
#include<string>
#include<fstream>
#include<vector>
using namespace std;

//	Split jakich pełno w sieci.
//	Wziąłem pierwszy lepszy przykład, może niezbyt optymalny.
std::vector<std::string> split_by(const std::string &text, char sep) {
	std::vector<std::string> tokens;
	std::size_t start = 0, end = 0;
	while ((end = text.find(sep, start)) != std::string::npos) {
		tokens.push_back(text.substr(start, end - start));
		start = end + 1;
	}
	tokens.push_back(text.substr(start));
	return tokens;
}

struct question
{
	string text;
	char correct_answer;
	vector<string> variants;
};

class test
{
private:
	vector<question> questions;

public:
	void read_questions(const char* path)
	{
		ifstream file(path);
		if (file.is_open())
		{
			string line = "";
			while (getline(file, line))
			{
				question question;
				vector<string> split = split_by(line, ';');

				question.text = split[0];
				question.correct_answer = split[1][0];

				for (size_t i = 2; i < split.size(); ++i)
				{
					question.variants.push_back(split[i]);
				}

				questions.push_back(question);
			}
			file.close();
		}
	}

	void print()
	{
		for (size_t i = 0; i < questions.size(); ++i)
		{
			cout << "Question: " << questions[i].text
				<< "\nAnswer: [" << questions[i].correct_answer << "]"
				<< "\nVariants:\n";

			char iter = 'a';
			for (size_t j = 0; j < questions[i].variants.size(); ++j)
			{
				cout << iter++ << "). " << questions[i].variants[j] << "\n";
			}
			cout << "\n";
		}
	}
};

int main()
{
	test t;
	t.read_questions("questions.txt");
	t.print();
	return 0;
}

Plik:

Winamp sluzy do:;a;odtwarzania muzyki;kompresji plikow;tworzenia grafiki
Winrar sluzy do:;c;tworzenia grafiki;odtwarzania muzyki;kompresji plikow;tworzenia animacji

Output:

Question: Winamp sluzy do:
Answer: [a]
Variants:
a). odtwarzania muzyki
b). kompresji plikow
c). tworzenia grafiki

Question: Winrar sluzy do:
Answer: [c]
Variants:
a). tworzenia grafiki
b). odtwarzania muzyki
c). kompresji plikow
d). tworzenia animacji
0

Akurat się złożyło, że korzystałem z boost serialization.
Troszkę rozczarowujące są warningi kompilatora, ale działa jak należy i jest bardzo proste w użyciu:
https://wandbox.org/permlink/Rtoen3gMo7JhdUKv

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