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

problem z prostym programem

Object Storage Arubacloud
0 głosów
160 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ź 170 wizyt
pytanie zadane 12 czerwca 2018 w Java przez blofeld Użytkownik (700 p.)
0 głosów
1 odpowiedź 1,060 wizyt
+1 głos
1 odpowiedź 240 wizyt

92,555 zapytań

141,402 odpowiedzi

319,552 komentarzy

61,939 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...