Zapisywanie danych do pliku - program nie działa poprawnie przy dłuższym ciągu znaków

0

Witam!
Chciałem stworzyć program przy pomocy którego można by układać quiz. Pytania i odpowiedzi byłyby zapisywane do pliku. Wszystko działa poprawnie do momentu, kiedy wpisuję w pytaniu całe zdanie. Wtedy przeskakuje mi wszystkie pętle i zapisuje pierwsze słowo w zdaniu do pliku. Jaka może być przyczyna tego problemu?

#include <conio.h>
#include <iostream>
#include <fstream>
#include <string>
#define getch() _getch() 
using namespace std;
int main()
{
	int ileP, ileO;
	fstream f;
	f.open("test.txt", ios::out);
	cout <<" podaj ilosc pytan: ";
	cin >> ileP;
	string* pytanie;
	pytanie = new string[ileP];
	string* odpowiedz;
	if (f.good())
	{
		for (int i = 0; i < ileP; i++)
		{
			cout << "podaj pytanie " << i + 1 << endl;
			cin >> pytanie[i];
			f << pytanie[i]<<endl;
			cout << "podaj ilosc odpowiedzi: ";
			cin >> ileO;
			odpowiedz = new string[ileO];
			for (int a = 0; a < ileO; a++)
			{
				cout << "podaj odpowiedz " << a + 1 << endl;
				cin >> odpowiedz[a];
				f << odpowiedz[a]<<endl;
			}
			
			
		}
	}
	delete[] odpowiedz;
	delete[] pytanie;

	f.close();
	getch();
}

dodanie znacznika <code class="cpp"> - furious programming

2

Problem w tym że jesteś zbyt leniwy żeby otworzyć dokumentacje.
cin>> czyta do pierwszego białego znaku. Użyj getline
Przy okazji zrób sobie tą przyjemność i użyj vector/list zamiast tablic.

0

Najlepiej powiedzieć osobie pytającej o pomoc w dziale NEWBIE, że problem tkwi w nim samym. De facto każdemu programiście można powiedzieć, że błąd w jego programie jest spowodowany samym programistą. Człowiek się zwraca z prośbą o pomoc i oczywiście czego można się spodziewać po moderatorze polskiego forum? Hejtu... niczego więcej. Od siebie mogę Ci polecić książkę "C++ szkoła programowania." Stephen Prata. Na tym polega chyba dział Newbie, że ktoś zdaje sobie sprawę z niskiego poziomu swojej wiedzy i dlatego pisze w tym dziale. Sam też miałem okazję dostać dopiero co niemiłą odpowiedź od moderatora po opublikowaniu postu w tym dziale. Niedługo wszyscy przejdą na zagraniczne fora, bo tam jest więcej wyrozumiałości. Spróbuj wykorzystać taki kod:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    int ileP, ileO;
    fstream f;
    f.open("test.txt", ios::out);
    cout <<" podaj ilosc pytan: ";
    cin >> ileP;
    while(cin.get() != '\n');
    string* pytanie;
    pytanie = new string[ileP];
    string* odpowiedz;
    if (f.good())
    {
        for (int i = 0; i < ileP; i++)
        {
            cout << "podaj pytanie " << i + 1 << endl;
            getline(cin,pytanie[i]);
            f << pytanie[i]<<endl;
            cout << "podaj ilosc odpowiedzi: ";
            cin >> ileO;
            while(cin.get() != '\n');
            odpowiedz = new string[ileO];
            for (int a = 0; a < ileO; a++)
            {
                cout << "podaj odpowiedz " << a + 1 << endl;
                cin >> odpowiedz[a];
                while(cin.get() != '\n');
                f << odpowiedz[a]<<endl;
            }


        }
    }
    delete[] odpowiedz;
    delete[] pytanie;

    f.close();
}

gdzie linie z cin.get != '\n' wczytują znaki ze strumienia do napotkania znaku nowej linii, czyli końca wpisanych danych, czyli czyści to bufor. getline jest funkcja, która znajduje się w pliku string. Pierwszy jej argument to obiekt typu istream, który wczytuje tekst, czyli standardowo możesz wykorzystać cin, a drugi to obiekt typu string, do którego znaki maja być wpisane. Jeżeli źle coś mówię to proszę o poprawienie. Jak się moderatorowi nie podoba co napisałem to spoczko można mi dać bana :) poradzę sobie korzystając z pomocy milszych ludzi niż Wy ;)

EDIT: usunąłem getch i #include<conio.h> dlatego, że na linuksie nie mam takich rzeczy niestety :) możesz sobie to dopisać z powrotem. Pozdrawiam :)

3

@Dawidpi

Najlepiej poczatkujacym dawac GOTOWCE, bo na pewno sie naucza wiecej. De facto nawet w pracy powinno sie zwalac robote komus i niech produkuje gotowce. Czlowiek zwraca sie o pomoc NIE PROBUJAC SAMEMU znalezc odpowiedzi. Taka osoba CHCE zostac programista, a w tej pracy SZUKANIE odpowiedzi jest KLUCZOWYM czynnikiem w praktycznie kazdym problemie.
Czego mozna sie spodziewac od kogos kto zaczyna i jedzie tylko na gotowach? NIC. A pozniej placze ze nie moze znalezc pracy.

Uwielbiam jak nowi uzytkownicy chca definiowac zasady na forum ktore istnieje zapewne dziesieciokrotnie dluzej niz jego kariera programistycza.
Uwielbiam jak zadaja to samo pytanie mimo ze wczoraj padlo jakies 2-3 razy i wystarczy uzyc opcji szukaj
...

nie chce juz mi sie wymieniac, ale ogolnie powodzenia z takim nastawieniem w Twojej karierze

2
Dawidpi napisał(a)

Człowiek się zwraca z prośbą o pomoc i oczywiście czego można się spodziewać po moderatorze polskiego forum? Hejtu... niczego więcej.

Tak? No popatrz - cóż za rozczarowanie... Wypowiedź @Shaloma nie ma nic wspólnego z hejtem - najpierw może dowiedz się co to jest, a później używaj tego słowa;

Problemem każdego Newbie jest przychodzenie na forum z każdym problemem, nawet takim, na który Google ma milion odpowiedzi; Kolejnym problemem jest niechęć bądź lenistwo, dlatego też nie zaglądają do dokumentacji, w której znajduje się masa cennych informacji;

Dawidpi napisał(a)

Na tym polega chyba dział Newbie, że ktoś zdaje sobie sprawę z niskiego poziomu swojej wiedzy i dlatego pisze w tym dziale.

Nie - dział Newbie co prawda jest dla początkujących, ale w żadnym wypadku nie zwalnia z samodzielności i szukania odpowiedzi we własnym zakresie; Największym problemem początkujących jest wyręczanie się forumowiczami i oczekiwanie na gotowce, zamiast samemu poszukać informacji w sieci; Na 90% pytań z tego działu odpowiedzi znajdują się w dokumentacji lub na innych forach czy grupach - trzeba tylko chcieć poszukać;

O debugerze już nawet nie wspominam...


Więc jeśli w wypowiedzi odsyłającej do Google/dokumentacji widzisz coś złego, to najprawdopodobniej sam jesteś Newbie i Ciebie także dotyczą powyższe problemy.

0

Stąd podałem pozycję dobrej książki, z której można się wiele nauczyc na temat języka C++, chodzi mi jedynie o to, że moderator jest niemiły.

To forum a zwłaszcza dział Newbie jest dla... Newbie, gdzie brak wiedzy to normalna rzecz. Moderator podał funkcję getline. Wszystko ok, ale musiał dorzucić docinkę co do lenistwa użytkownika kadash? Nie musiał, ale dorzucił, bo przecież to takie fajne jeździć po osobach, które wiedzą mniej. To takie bardzo polaczkowate niestety. Spójrz na inne fora zagraniczne. Nie ma tam takiego bólu .... zaawansowanych i średniozaawansowanych programistów, że ktoś czegoś nie wie nawet jeśli dotyczy to podstaw. U mnie na studiach np. na podstawach programowania takich rzeczy nie ma (Nie ma dokładnego wyjaśnienia jak działają obiekty cin cout, ani jakie mają metody, to samo jeśli chodzi o klasę string, stąd rozumiem, że kadash nie miał nawet pojęcia o istnieniu takich rzeczy). Kto chce wiedzieć więcej musi sam sobie radzić i zgodzę się, że szukanie to ważna rzecz w programowaniu, ale początkującemu (też do nich należę) po prostu trzeba pomóc. Dałem gotowy program racja, ale wyjśniłem co dodałem, po co dodałem i podałem też książkę, gdzie znaleźć więcej info, więc nie czuję się winny temu, że podałem gotowca bez niczego.

Wybacz fasadin, że nie lubię jak ludzie po sobie jeżdżą. Jeżeli uważasz to za normalne to również życzę Ci powodzenia... ale w życiu.

@fasadin

0
furious programming napisał(a):

Problemem każdego Newbie jest przychodzenie na forum z każdym problemem, nawet takim, na który Google ma milion odpowiedzi; Kolejnym problemem jest niechęć bądź lenistwo, dlatego też nie zaglądają do dokumentacji, w której znajduje się masa cennych informacji;

Dawidpi napisał(a)

Na tym polega chyba dział Newbie, że ktoś zdaje sobie sprawę z niskiego poziomu swojej wiedzy i dlatego pisze w tym dziale.

Nie - dział Newbie co prawda jest dla początkujących, ale w żadnym wypadku nie zwalnia z samodzielności i szukania odpowiedzi we własnym zakresie; Największym problemem początkujących jest wyręczanie się forumowiczami i oczekiwanie na gotowce, zamiast samemu poszukać informacji w sieci; Na 90% pytań z tego działu odpowiedzi znajdują się w dokumentacji lub na innych forach czy grupach - trzeba tylko chcieć poszukać;

O debugerze już nawet nie wspominam...

  1. Czytanie dokumentacji wcale nie zawsze jest takie proste, zwłaszcza dla początkujących, bo jak ktoś kto powiedzmy jest w 1/4 czytania jakiejś książki, a będzie chciał się dowiedzieć czegoś na temat obiektu cin a tu mu wyskoczy, że dziedziczy po ios_base to raczej nie będzie wiedział co i jak.
  2. Ja mówię o niskim stanie wiedzy, a Ty zupełnie o czym innym. Powinno się po prostu zrozumieć to, że ktoś może mieć niski stan wiedzy.
  3. Racja nie wspominaj... wiadomka, że na początku każdego kursu programowania omawia się debugger... logiczne przecież.

Nie mniej jednak uważam, że jeśli nie chcecie pomagać, albo macie być chamscy lub niemili po prostu nie pomagajcie... tyle. Nie chodzi mi o to, że nie powinniśmy szukać i absolutnie nigdzie tego nie napisałem. Chodzi mi o docinki z waszej strony.

0

Niski stan wiedzy nie zwalnia z samodzielności. Dokumentacja powinna być pierwszym miejscem gdzie zaglądamy kiedy mamy problem tego typu. Autor tego nie uczynił co tłumaczyć można tylko lenistwem, no bo czym innym? Ktoś mu zabronił rzucić okiem w dokumentacje?
Twierdzisz że na zagraniczych forach jest inaczej? pics or it didn't happen. Na takim StackOverflow takie tematy znikają od razu. Ten wątek ma słaby tytuł i brak tagów. Na SO nie wisiałby nawet 5 minut. Masz racje, tam nikt nie nazwałby autora leniem. Nikt by nie zdążył, bo moderacja by to usunęła...

0

Proponuję zakończyć dyskusję bo do nikąd nie prowadzi. Proszę o usunięcie całej tej kłótni, ale jak tak bardzo chcesz looknąć na SO to proszę - obraz w załączniku. Gorszy błąd niż kolegi powyżej.

@fasadin 4 lata temu to było takie samo pytanie jak i teraz, a tłumaczyć se możesz zawsze jak chcesz, ale dużo pytań bardzo podstawowych ma odpowiedź na stack overflow. Jeszcze raz apeluję o usunięcie kłótni. w końcu wam powinno zależeć na czystości na forum.

0

Może ja zakończę ten temat.
@Shalom Szukałem rozwiązania, ale najwidoczniej nieskutecznie. Próbowałem opcję z

getline(cin, string);

wcześniej, ale nie chciał mi pobrać danych, dlatego wrzuciłem tutaj kod z cin >>. Brakowało mi linijki kodu:

while(cin.get() != '\n');

Przepraszam, jeśli wzbudziłem w Tobie frustracje, ale to nie był mój cel. Dziękuję za pomoc. Poczytam jeszcze o vector.

@Dawidpi Dziękuję za pomoc i walkę w moim interesie.
Do całej reszty: więcej spokoju. Ja się tylko uczę i proszę o pewną dozę wyrozumiałości. Czasem pojawi się głupi błąd lub niedopatrzenie i nie wrzucajcie ludzi do jednego worka. Pozdrawiam i wracam do nauki!

dodanie znaczników <code class="cpp"> - furious programming

6
kadash napisał(a):

@Dawidpi Dziękuję za pomoc i walkę w moim interesie.

Ta walka nie jest w twoim interesie. @Dawidpi walczy przeciwko tobie: abyś dalej nie umiał myśleć, abyś nie umiał sobie poradzić bez czyjejś pomocy, abyś nadal myślał, że brak umiejętności korzystania z googla nie jest potężną wadą.
To @furious programming i @fasadin walczą w twoim interesie.

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