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

vector obiektów - operacja na indexach

Object Storage Arubacloud
0 głosów
265 wizyt
pytanie zadane 14 czerwca 2023 w C i C++ przez cpp_enjoyer Nowicjusz (150 p.)

Witam, w pliku Questions.txt. mam pytania wraz z odpowiedziami. są one w takim formacie:

Jakiego koloru jest niebo?

niebieskiego

zielonego

żółtego

białego

 

Zamysłem kodu jest wyświetlenie Pytania x  wraz z odpowiedziami x. Po ponownym uruchomieniu powinno się wyświetlić Pytanie x+1 wraz z odpowiedziami x+1. O ile pytania się zmieniają, tak odpowiedzi zostają do pierwszego pytania. Co powinienem zrobić żeby odpowiedzi zmieniały się wraz z pytaniami?

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

struct Question {
std::string question;
std::string answerA;
std::string answerB;
std::string answerC;
std::string answerD;
};

std::vector<Question> loadQuestions(const std::string& filename) {
std::ifstream file(filename);
if (!file.is_open()) {
std::cerr << "Nie można otworzyć pliku: " << filename << std::endl;
return {};
}

std::vector<Question> questions;
Question currentQuestion;
std::string line;

while (std::getline(file, line)) {
if (line.find(":") != std::string::npos || line.find("?") != std::string::npos) {
// Nowe pytanie
if (!currentQuestion.question.empty()) {
questions.push_back(currentQuestion);
}
currentQuestion.question = line;
} else {
// Odpowiedzi
if (currentQuestion.answerA.empty()) {
currentQuestion.answerA = line;
} else if (currentQuestion.answerB.empty()) {
currentQuestion.answerB = line;
} else if (currentQuestion.answerC.empty()) {
currentQuestion.answerC = line;
} else if (currentQuestion.answerD.empty()) {
currentQuestion.answerD = line;
}
}
}

// Dodaj ostatnie pytanie do wektora
if (!currentQuestion.question.empty()) {
questions.push_back(currentQuestion);
}

file.close();
return questions;
}

void saveIndex(const std::string& filename1, int index) {
std::ofstream file(filename1, std::ofstream::trunc); // Otwarcie pliku w trybie czyszczenia zawartości
if (file.is_open()) {
index=index+1;
file << index;
file.close();
} else {
std::cerr << "Nie można zapisać pliku: " << filename1 << std::endl;
}
}

int loadIndex(const std::string& filename1) {
std::ifstream file(filename1);
if (!file.is_open()) {
std::cerr << "Nie można otworzyć pliku: " << filename1 << std::endl;
return -1;
}

int index = -1;
file >> index;
file.close();
return index;
}

int main() {
int index;
std::string filename = "Questions.txt";
std::vector<Question> questions = loadQuestions(filename);

std::string filename1 = "Index.txt";
index=loadIndex(filename1);

const Question& Question1 = questions[index];
std::cout << Question1.question << std::endl;
std::cout<<"A: " << Question1.answerA << std::endl;
std::cout<<"B: " << Question1.answerB << std::endl;
std::cout<<"C: " << Question1.answerC << std::endl;
std::cout<<"D: " << Question1.answerD << std::endl;


saveIndex(filename1,index);

return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 14 czerwca 2023 przez j23 Mędrzec (194,920 p.)
wybrane 14 czerwca 2023 przez cpp_enjoyer
 
Najlepsza

Jeśli dane w pliku są zawsze w formie pytanie -> 4 odpowiedzi, to zrób tak:

std::istream& readQuestion(std::istream& is, Question &q)
{
     std::getline(is >> std::ws, q.question);
     std::getline(is >> std::ws, q.answerA);
     std::getline(is >> std::ws, q.answerB);
     std::getline(is >> std::ws, q.answerC);
     std::getline(is >> std::ws, q.answerD);
     return is;
}

std::vector<Question> loadQuestions(const std::string& filename) 
{
    std::ifstream file(filename);
    if (!file.is_open()) {
        std::cerr << "Nie można otworzyć pliku: " << filename << std::endl;
        return {};
    }
     
    std::vector<Question> questions;
    Question question;

    while (readQuestion(file, question)) {
        questions.push_back(std::move(question))
    }
    
    return questions;
}

 

komentarz 14 czerwca 2023 przez cpp_enjoyer Nowicjusz (150 p.)
Kurde, faktycznie o tym nie pomyślałem, już trzecią godzinę nad tym siedziałem a rozwiązanie było prostsze niż myślałem... No nic, dzięki wielkie za pomoc!

Podobne pytania

0 głosów
1 odpowiedź 532 wizyt
pytanie zadane 7 kwietnia 2020 w C i C++ przez qwx6 Początkujący (300 p.)
0 głosów
1 odpowiedź 1,241 wizyt
pytanie zadane 16 czerwca 2017 w C i C++ przez excavelty Bywalec (2,480 p.)
0 głosów
2 odpowiedzi 488 wizyt
pytanie zadane 13 maja 2017 w C i C++ przez neos Początkujący (320 p.)

92,669 zapytań

141,567 odpowiedzi

320,037 komentarzy

62,034 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

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!

...