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

Jak odczytać dany wiersz z pliku?

Object Storage Arubacloud
0 głosów
386 wizyt
pytanie zadane 22 kwietnia 2018 w C i C++ przez giedymin33 Początkujący (290 p.)

Mam zrobić zapis gry w kółko i krzyżyk. Mam zapisać stan gry do pliku (obecny ruch, nicki graczy, i stan tablicy).

Potrzebuję to teraz odczytać wierszami, gdyż przykładowo w 1 wierszu w pliku mam nick1 gracza, w drugim wierszu mam nick2 gracza, w 3 wierszu mam licznik ruchu a w kolejnych wierszach odpowiednio elementy tablicy, potrzebne do wypisania planszy. Zapis wygląda następująco:

 

void zapis()
{
    FILE *wskaznik_na_plik;

    wskaznik_na_plik = fopen(nazwa,"w");

fputs(nick1,wskaznik_na_plik);
fputs("\n",wskaznik_na_plik);
fputs(nick2,wskaznik_na_plik);
fputs("\n",wskaznik_na_plik);
fprintf(wskaznik_na_plik,"%d",licznik);
fputs("\n",wskaznik_na_plik);

for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
{
    fprintf(wskaznik_na_plik,"%d\n",tab[i][j]);
}

}

fclose(wskaznik_na_plik);

}

Chcę potem przy "wczytaniu gry" użyć switcha, który będzie wczytywał do zmiennych w programie treści danych wierszy w pliku, żebym mógł już później na luzie odpalić funkcje, odpowiedzialne za rozgrywkę. Mam coś takiego:

 

void wczytajgre()
{
    FILE *wskaznik_na_plik;
    int nr_linii=1;
    char linia;
    char nazwa_pliku;

printf("Podaj nazwe pliku: ");
scanf("%s",nazwa_pliku);

    wskaznik_na_plik = fopen(nazwa_pliku,"r");

    while(fgets(linia,100,wskaznik_na_plik))
    {
        switch(nr_linii)
        {
            case 1: nick1[50] = nr_linii;   break;
            case 2: nick2[50] = nr_linii;   break;
            case 3: licznik = nr_linii;     break;
            case 4: tab[0][0]= nr_linii;    break;
            case 5: tab[0][1]= nr_linii;    break;
            case 6: tab[0][2]= nr_linii;    break;

            case 7: tab[1][0]= nr_linii;    break;
            case 8: tab[1][1]= nr_linii;    break;
            case 9: tab[1][2]= nr_linii;    break;

            case 10: tab[2][0]= nr_linii;   break;
            case 11: tab[2][1]= nr_linii;   break;
            case 12: tab[2][2]= nr_linii;   break;
        }
        nr_linii++;
    }
fclose(wskaznik_na_plik);

[...] << tutaj dalsza część rozgrywki

Nie pasuje mi tutaj funkcja fgets, bo w tutorialu p. Zelenta była funkcja getline. Coś w zamian?

Proszę o pomoc

2 odpowiedzi

0 głosów
odpowiedź 22 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

Pierwszy parametr funkcji fgets to char*, nie char.

switch(nr_linii) {
    case 1: nick1[50] = nr_linii;   break;
    case 2: nick2[50] = nr_linii;   break;
    case 3: licznik = nr_linii;     break;
    case 4: tab[0][0]= nr_linii;    break;
    case 5: tab[0][1]= nr_linii;    break;
    case 6: tab[0][2]= nr_linii;    break;
 
    case 7: tab[1][0]= nr_linii;    break;
    case 8: tab[1][1]= nr_linii;    break;
    case 9: tab[1][2]= nr_linii;    break;
 
    case 10: tab[2][0]= nr_linii;   break;
    case 11: tab[2][1]= nr_linii;   break;
    case 12: tab[2][2]= nr_linii;   break;
}

Co zmienna nr_linii ma wspólnego z tym co odczytasz z pliku?

komentarz 22 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

Widzisz różnicę między znakiem, a tablicą znaków?

przy %c chociaż zczytuje dane

Ciekawe gdzie je sczytuje. To, że przy %c w takiej formie nie wywala, to tylko przypadek. Nie dziw się jak nagle przy %c też zacznie crashować.

atoi też do nick1   i nick2?

A ten pomysł skąd Ci przyszedł do głowy? 

komentarz 22 kwietnia 2018 przez giedymin33 Początkujący (290 p.)
Piszesz coś o konwersji napisu na int, ale nie piszesz po co, więc nie wiem o co Ci chodzi.
komentarz 22 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
char linia[50];
int licznik;
// ...
licznik = linia;

Przypisujesz do zmiennej typu int tablicę charów. Jak myślisz, w jaki sposób ma to działać?

komentarz 24 kwietnia 2018 przez Dudman Nowicjusz (180 p.)

@Qwerty96, Nie rozumiem dokładnie o co chodzi, ale ja zapisałbym to w taki sposób:

int tablica[3][3];                   //jeżeli w zmiennej jest 0 to pole jest puste
                                              //jeżeli w zmiennej jest 1 to na polu jest O
                                              //jeżeli w zmiennej jest 2 to na polu jest X
                                 
for(int i=0;i<3;i++)                        
{
for(int j=0;j<3;j++)
{
plik<<tablica[i][j]<<endl;
}
}

//Przy wczytywaniu:

//kod wczytujący nicki graczy

//kod wczytujący stan planszy:

for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
plik>>tablica[i][j];
}
}

 

komentarz 26 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Sądząc po kodzie pytanie dotyczy języka C, nie C++.
0 głosów
odpowiedź 24 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
Jeśli graczy ma być kilku (używaż l.mnogiej), to proponuję wszystkie dane pojedynczego gracza zapisywać w jednej linii. Następnego gracza w kolejnej linii, itd.

Do odczytu wcale nie musisz używać funkcji getline().

Podobne pytania

–1 głos
3 odpowiedzi 523 wizyt
pytanie zadane 20 sierpnia 2020 w C i C++ przez Drożdżówka Obywatel (1,870 p.)
0 głosów
3 odpowiedzi 527 wizyt
pytanie zadane 4 czerwca 2017 w C i C++ przez piwo300 Nowicjusz (120 p.)
+1 głos
1 odpowiedź 840 wizyt
pytanie zadane 1 maja 2016 w C i C++ przez zkkf56 Dyskutant (8,710 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...