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

problem z prostym programem

0 głosów
412 wizyt
pytanie zadane 31 grudnia 2020 w C i C++ przez patryk8 Początkujący (300 p.)

dzień dobry

   staram się uczyć c++ ostatnio w kursie na youtube  poznałem funkcje i uznałem że czas zrobić naprawdę duży program by utrwalić wiedzę, chciałem zrobić tekstową grę rpg wrzucając dużo możliwości by jak najlepiej utrwalić wiedzę  niestety wywaliłem się na samym początku normalnie próbował bym naprawić aż do skutku ale problem wydaje się mnie przerastać. 

 

pomyślałem by zrobić wybór języka chciałem zrobić to tak że cały tekst gry zamknę w 2 plikach txt, w jednym język polski a w drugim angielski a gracz wybierze na początku rozgrywki z którego korzystać  a odpowiednia funkcja "int napisy()" będzie brała linie teksu która jest mi aktualnie potrzebna i wyświetlała.

aktualny kod wygląda tak

#include <iostream>
#include <windows.h>
#include <fstream>
#include <stdio.h>
#include <cstdlib>
#include <conio.h>
#include <cstdio>


using namespace std;
fstream jezyk;
int n_t=0;

int napisy(int n_tekst)
{
    string linia,tekst;
    int i =0;

    //if (n_t==1){ n_t++;n_tekst--;}else {n_t++;}
    for (int n=0;i<n_tekst;i++)
    {getline(jezyk,linia);}
    tekst=linia;

    cout << tekst << endl;

    return n_tekst;

}



int main()
{
    string  tekst;
    char wybory;

    cout << "        language/jezyk    " << endl;
    cout << "      [1]english/[2]polish" << endl;

    wybory=getch();
    system("cls");

    if (wybory=='2')
    {
       jezyk.open("jezyk,pl.txt",ios::in );
    }else
    {
    jezyk.open("jezyk,eng.txt",ios::in );
    }

     napisy (1);
     napisy (2);
     napisy (3);
     napisy (4);
     napisy (5);
     wybory=getch();


   jezyk.close (); return 0;
}

zawartość pliku "jezyk,eng.txt"

"

         MENU 
---------------------
[1]new game
[2]load game
[3]score board
[4]exit

" w "jezyk,pl.txt" jest to samo tylko po polsku

 

Po naprawieniu mniejszych błędów  i włączeniu  programu menu główne gry wygląda tak

"

         MENU
[1]new game
[4]exit

"

 z pliku tekstowego  zostały wzięte linie 1,3,5. zamiast wszystkich i nie mam pojecie dlaczego a siedzę nad tym kilka dłuższych chwil.

 Po kilku próbach naprawienia tego pomyślałem że jeśli bierze co drugą linie to tymczasowym rozwiązaniem będzie  wczytywanie linii o 1 mniejszej co drugi raz gdy wykonuje się funkcja, wiec napisałem prostego if  który jest aktualnie w kodzie powyżej po 2 ukośnikach ale wystartowaniu programu teraz stało się coś jeszcze dziwniejszego. 

Pojawiła się coś takiego

"

         MENU
---------------------
[3]score board
[4]exit  

"

co oznacza się pojawiły się linie 1,2,5,6

i w tym momencie postanowiłem napisać na jakimś forum z pytaniem bo za nic nie umiem zrozumieć co tu się stało. 

 

  Wiem że to błahy problem  zaczynam dopiero z nauką to dziwne gdybym miał trudny problem ale mam nadzieje że ktoś mi pomoże i gdyby był bardzo miły wytłumaczył dlaczego program brał co drugą linie 

 

1 odpowiedź

+2 głosów
odpowiedź 31 grudnia 2020 przez Psz3mo Mądrala (5,030 p.)
wybrane 31 grudnia 2020 przez patryk8
 
Najlepsza

Po pierwsze wywołujesz funkcję 'napisy' tylko 5 razy a powinieneś 6. Nie wyświetla ci prawidłowych wartości, ponieważ jako argument do funkcji podajesz numer linii, nie zamykasz nigdzie pliku, więc jako argument powinieneś podać ile mam przeskoczyć linii, aby dotrzeć do tej linii.

U mnie to wygląda tak:

napisy(2);
    napisy(1);
    napisy(1); 
    napisy(1); 
    napisy(1);
    napisy(1);

Po drugie funkcję 'napisy' wywołujesz jako int. Lepiej będzie jak zapiszesz ją jako void - bo nie musisz nic zwracać w tej funkcji.

Po trzecie nie wiem czemu w funkcji int i = 0 jest wyżej przecież nigdzie go za pętlą nie używasz możesz zapisać tak: (zamiast n)

for (int i = 0; i < n_tekst; i++)

Po czwarte zamiast ciągle przypisywać wartość linia do tekst możesz w pętli dodać taki warunek:

for (int i = 0; i < n_tekst; i++)
    {
        getline(jezyk, linia);
        if (i == n_tekst-1) tekst = linia;
    }

I tak jeszcze się przyglądam, że do funkcji getline najlepiej przypisać biblioteke 

#include <string>

Po tym wszystkim powinno ci to zadziałać.

1
komentarz 31 grudnia 2020 przez patryk8 Początkujący (300 p.)
dzięki wielkie

jak pisałem popełniłem głupie błędy a teraz działa poprawnie i wiem dlaczego nie działało.

Podobne pytania

0 głosów
1 odpowiedź 354 wizyt
pytanie zadane 12 czerwca 2018 w Java przez blofeld Użytkownik (700 p.)
0 głosów
1 odpowiedź 1,445 wizyt
+1 głos
1 odpowiedź 463 wizyt

93,762 zapytań

142,717 odpowiedzi

323,368 komentarzy

63,359 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...