Wpisanie danych do pliku tekstowego

0

Mam za zadanie zrobić program wpisujący dane do pliku tekstowego, w moim wypadku test z wieloma odpowiedziami.

Problem jest w tym, że jak wpisuję pytanie, to nie jest ono przypisywane do rekord[c].pytanie, tylko do pozostałych zmiennych.

Np. pytanie: "Ile to 2 razy 2" skutkuje tym, że:
rekord[c].pytanie = Ile
rekord[c].wybor.odpa = to
rekord[c].wybor.odpb = 2
rekord[c].wybor.odpc = razy
rekord[c].wybor.odpd = 2

Jak zrobić, by traktował całe pytanie jako jedno, a potem poprawnie odczytywał?

Kod:

#include <iostream.h>
#include <fstream.h>
#include <conio.h> 
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    struct odpowiedzi
    {
       char odpa[10];
       char odpb[10];
       char odpc[10];
       char odpd[10];
       char odpp[1];
    };

    struct zadanie
    {
       char pytanie[100];
       odpowiedzi wybor;
    };
    
    int i;
    zadanie rekord[30];
    cin>>i;
    ofstream plik;
    for ( int c = 1 ; c <= i ; c++ ){
    plik.open("plik.txt");
    cout<<"Podaj pytanie: "<<endl;
    cin>>rekord[c].pytanie;
    cout<<"Podaj odpowiedz a: "<<endl;
    cin>>rekord[c].wybor.odpa;
    cout<<"Podaj odpowiedz b: "<<endl;
    cin>>rekord[c].wybor.odpb;
    cout<<"Podaj odpowiedz c: "<<endl;
    cin>>rekord[c].wybor.odpc;
    cout<<"Podaj odpowiedz d: "<<endl;
    cin>>rekord[c].wybor.odpd;
    cout<<"Podaj odpowiedz poprawna (a/b/c/d): "<<endl;
    cin>>rekord[c].wybor.odpp;
	plik.write((char *) &c, sizeof(zadanie));}
	plik.close();
	
    ifstream plik1;
	plik1.open("plik.txt");
	for ( int c = 1 ; c <= i ; c++ )
	{
              cout<<"1. Pytanie: "<<endl;
              cout<<rekord[c].pytanie<<endl;
              cout<<"Odpowiedz a: ";
              cout<<rekord[c].wybor.odpa<<endl;
              cout<<"Odpowiedz b: ";
              cout<<rekord[c].wybor.odpb<<endl;
              cout<<"Odpowiedz c: ";
              cout<<rekord[c].wybor.odpc<<endl;
              cout<<"Odpowiedz d: ";
              cout<<rekord[c].wybor.odpd<<endl;
          plik1.read((char *) &c, sizeof(zadanie));
    }
    plik1.close();
    system("PAUSE");
    return EXIT_SUCCESS;
}
0

Staram się zrozumieć twój tok rozumowania, podczas tworzenia tego kodu, ale to chyba jakiś nieznany mi poziom abstrakcji. Zróbmy tak, napisz nam co jest w plikach tekstowych, oraz co ma robić program.. Wydaje mi się, że program wymaga przynajmniej gruntownej modernizacji..

0

Program ma wpisywać dane do pliku, po podaniu ilości pytań ma wprowadzić dane wg. wzoru (struktura):

  • Pytanie
  • Odpowiedź A na to pytanie
  • Odpowiedź B na to pytanie
  • Odpowiedź C na to pytanie
  • Odpowiedź D na to pytanie
  • Które z A/B/C/D jest poprawne - ale to w tym wypadku bez znaczenia.

A potem wyświetlić to wszystko na ekranie.

Problem w tym, że gdy się pojawia spacja w pytaniu, automatycznie kolejny wyraz z pytania jest do następnej zmiennej przypisywany.

0

Wczytuj getline();
ale twój kod jest strasznie brzydki.. Dlaczego nie stworzysz jednej klasy, która zawiera pytania i odpowiedzi?
Pokaż jak wyglądają pliki, to może coś na to zaradzimy:)

0

Pytań z założenia ma być 30. Każde pytanie ma 4 odpowiedzi + 1 jako oznaczenie, która jest poprawna. Użytkownik rozwiązując potem test dostaje 10 pytań (generowane z przedziału 1-3, 4-6, 7-9 itd.), udziela odpowiedzi naciskając odpowiednio a, b, c lub d i ta wartość jest porównywana z poprawną. Jeśli zgadza się, to użytkownik dostaje punkt.

Tyle że pytania mają zostać wczytane z pliku, a nie umieszczone bezpośrednio w programie.

0

Ja bym to zrobił mniej więcej Miej więcej tak:

#include <string>
#include <vector>
#include <iostream>
#include <fstream>
using namespace std;
class Question{
private:
    string question;
    string response[4];
    string indexOfGoodReply;
public:
    Question(string q,string t[4],string n){
        question = q;
        for(int i=0;i<4;i++)
        response[i] = t[i];
        indexOfGoodReply = n;
    }
    string GetQuestion(){
        return question;
    }
    void ShowResponse(){
        for(int i=0;i<4;i++)
            cout << (char)(i+97) <<") " << response[i] << endl;
    }
    string GetGoodReply(){
        return indexOfGoodReply;
    }
};
int main(int argc, char *argv[]){
    ifstream in("test.txt");
    vector<Question>tab;
    string question ,t[4],n;
    while(getline(in,question)){
        for(int i=0;i<4;i++)
            getline(in,t[i]);
        getline(in,n);
        Question temp(question,t,n);
        tab.push_back(temp);
    }
    for(int i=0;i<tab.size()-1;i++){
        cout<<tab[i].GetQuestion()<<endl;
        tab[i].ShowResponse();
        cout<<"Odpowiedz: "<<tab[i].GetGoodReply()<<endl;
    }
    in.close();
    return 0;
}

W założeniach, że plik będzie wyglądał np. tak:

Jaki kolor ma czerwony maluch

  • Czerwony
  • Niebieski
  • Zielony
  • żółty
    A
    Jaki kolor ma zielony maluch
  • Czerwony
  • Niebieski
  • Zielony
  • żółty
    C
    Jaki kolor ma czerwony maluch
  • Czerwony
  • Niebieski
  • Zielony
  • żółty
    A
    Jaki kolor ma zielony maluch
  • Czerwony
  • Niebieski
  • Zielony
  • żółty
    D

Oczywiście, to nie jest gotowy program, ale wczytuje wszytko do plików i masz to jakoś rozsądnie poukładane. Myślę, że +- 25 linijek i program będzie skończony..

0

Wiem, że mój program jest dosyć archaiczny, ale prowadzący zajęcia będzie raczej wymagał w takiej formie jak ja pisałem.

Dlatego ponawiam problem: czy jest możliwość, by spacja w pytaniu nie powodowała przejścia do następnej zmiennej?

0

a Ja ponawiam odpowiedź. Wczytuj całe linijki używając getline(), tak jak ja to robię..
P.S nie sądzę aby jakikolwiek prowadzący wymagał takiego kodu..

0

Nie wiem czy dobrze rozumiem, ale zamiast:

cin>>rekord[c].pytanie;

dać

cin.getline(rekord[c].pytanie, 30);

Tak?

0

Raczej:
jeżeli czytasz z pliku

ifstream in("test.txt");

 ****

getline(in,rekord[c].pytanie);

lub

getline(cin,rekord[c].pytanie);

jeżeli czytasz z klawiatury.

0

invalid conversion from void*' to char*'
oraz
invalid conversion from char*' to int'

w tej chwili błędy.

0

Przepraszam, ale tego co Tu napisałeś nawet nie mam zamiaru próbować kompilować. Czytaj tak jak ja Ci zaproponowałem a nie jakieś:

 plik.write((char *) &c, sizeof(zadanie));

ja w ogóle wywaliłbym całego maina i zaczął jeszcze raz.. Te struktury też bym wywalił, ale jak bardzo chcesz, to da się coś z tego zrobić..
Poczytaj sobie jak się czyta z pliku, poczytaj o std::vector i nie będzie z tym problemu.
Dlaczego nie dasz w tych strukturach stringów:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct odpowiedzi{
   string odpa;
   string odpb;
   string odpc;
   string odpd;
   string odpp;
};
struct zadanie{
   string pytanie;
   odpowiedzi wybor;
};

albo w przypadku struktury odpowiedzi, tablicy stringów:

struct odpowiedzi{
   string odp[4];
   string odpp;
};
1

Ogólnie kiła i mogiła, jak masz iść w zaparte i pisać dalej to coś, to ja już Ci nie pomogę.
Tyle mogę dla Ciebie zrobić:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct odpowiedzi{
   string odp[4];
   string odpp;
};
struct zadanie{
   string pytanie;
   odpowiedzi wybor;
};
int main(){
    int n;
    cin>>n;
    zadanie rekord[30];
    ofstream plik("test.tx");
    for(int i=0;i<n;i++){
        cout<<"Podaj pytanie: "<<endl;
        cin>>rekord[i].pytanie;
        cout<<"Podaj odpowiedz a: "<<endl;
        cin>>rekord[i].wybor.odp[0];
        cout<<"Podaj odpowiedz b: "<<endl;
        cin>>rekord[i].wybor.odp[1];
        cout<<"Podaj odpowiedz c: "<<endl;
        cin>>rekord[i].wybor.odp[2];
        cout<<"Podaj odpowiedz d: "<<endl;
        cin>>rekord[i].wybor.odp[3];
        cout<<"Podaj odpowiedz poprawna (a/b/c/d): "<<endl;
        cin>>rekord[i].wybor.odpp;
        plik<<rekord[i].pytanie<<"\n"<<rekord[i].wybor.odp[0]<<"\n i tak dalej...";
    }
    plik.close();
    return 0;
}

Na podstawie tego już coś możesz nadźgać, chociaż jest to wybitne g*wno..
Jak nie potrafisz tego skończyć, to daj ogłoszenie w dziale praca, jakiś student za parę złotych to dokończy.

0

A Ty widać jesteś alfą i omegą. Myślisz że wszystkie mózgi pozjadałeś? A Ty jak zaczynałeś? Czyżbyś od razu wielkie projekty bezbłędnie robił? Nie sądzę.

Mimo to dziękuję za jakąkolwiek odpowiedź. Niestety nic z tego mi nie pomogło.

1

Dostałeś jednego gotowca, który wszystko wczytuję i wystarczy sprawdzać za pomocą == czy wynik jest równy sugerowanej odpowiedzi. Napisałem Ci jak wczytywać te pliki do twojej niedorobionej struktury, mało tego poprawiłem ją, żeby jakoś wyglądała a Ty piszesz, że "Niestety nic z tego mi nie pomogło."
Nic Ci nie pomoże, bo Ty nic nie potrafisz. Nabazgrałem tu dosyć sporu i prawie każdy laik coś by z tego wyniósł, a to, że Ty nie potrafisz, to twój problem, z którym musisz zmierzyć się sam..
Powodzenia.

0

Tu nie chodzi o wykorzystywanie innych, bardziej zaawansowanych metod, tylko o zastosowanie tego, co poznałem na zajęciach. Niestety to jest pod koniec semestru i nie przekazał prowadzący tego -_-

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