Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

c++ - Wczytywanie z pliku .txt całej linii

hellios890 08 Lis 2015 17:16 924 18
  • #1 08 Lis 2015 17:16
    hellios890
    Poziom 10  

    Witam.
    Mam problem dotyczący mojego projektu gry rpg.
    Szukałem po googlach ale nic nie znalazłem, więc ostatecznie kieruję pytanie tam gdzie zawsze dostaje odpowiedź :)


    No więc zapisuje dane do pliku txt tym kodem:

    Spoiler:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a następnie wczytuje je tym kodem:
    Spoiler:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jednak po wczytaniu w informacjach postaci zamiast wyświetlać się :
    Nie masz broni
    Nie masz Tarczy

    Wyświetla:
    masz broni
    masz tarczy

    Kod zapisu chyba jest w porządku, ponieważ w pliku .txt jest zapisane tak jak powinno być. Czyli to musi być coś w kodzie wczytywania. Będę wdzięczny za pomoc.

    0 18
  • #2 08 Lis 2015 17:49
    -psiak-
    Poziom 32  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #3 08 Lis 2015 18:25
    hellios890
    Poziom 10  

    Jest gorzej bo po wywaleniu z

    Kod: c
    Zaloguj się, aby zobaczyć kod

    getline(plik, bron);
    getline(plik, tarcza);
    Nie wczytuje wogole liniejek i teraz w informacjach wyswietla
    Nie
    Masz

    0
  • #4 08 Lis 2015 18:54
    -psiak-
    Poziom 32  

    W takim razie użyj ws:

    Kod: c
    Zaloguj się, aby zobaczyć kod
    trzeba dołączyć <iomanip>

    0
  • #5 08 Lis 2015 19:01
    hellios890
    Poziom 10  

    Dalej to samo.
    Ale przecież jak wywale getline to nie pobiera całej linijki.
    Chodzi mi o fragmęt kodu, który napisałem wyżej. Nie klasa, imie tylko bron, tarcza.
    Bo wszystko działa poprawnie po za tymi dwoma.
    Zamiast wczytać Nie masz broni
    Wczytuje masz broni
    Czyli gdzieś urywa słowo Nie

    0
  • #6 08 Lis 2015 19:42
    -psiak-
    Poziom 32  

    Podaj typy tych składowych/zmiennych.

    0
  • #7 08 Lis 2015 19:48
    hellios890
    Poziom 10  

    Typy

    Spoiler:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zapis
    Spoiler:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Wczytywanie
    Spoiler:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tu Wyswietla
    Spoiler:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #8 08 Lis 2015 19:58
    Krawiec91
    Poziom 12  

    Zrób z samym getline() bez wczytywania z użyciem operatora strumieniowego >>. Pierwszy raz wczytujesz z użyciem tego operatora łańcuch tekstowy do pierwszego napotkanego białego znaku, czyli słowo "Nie". Potem z użyciem getline() wczytujesz resztę, która nadpisuje string, do którego zapisujesz dane z pliku i stąd ucina Ci pierwsze słowo.

    0
  • #9 08 Lis 2015 20:05
    hellios890
    Poziom 10  

    ehh.. Teraz w ogóle się nie chce skompilować.
    Dam cały kod może coś wymyślisz.

    Spoiler:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    [/spoiler]

    0
  • Pomocny post
    #10 08 Lis 2015 20:12
    -psiak-
    Poziom 32  

    1. Lepiej zamień te zmienne na typy całkowite a dodaj tablice struktur: struct { const char *name; int ExStrange,ExAttack,ExDeffence; } Weapons[]={ {"Nie masz broni"},{"Katana",0,2,1}, }; czyli teraz bron jest typu int zaś jej nazwa to Weapons[bron].name
    2. Jeżeli już koniecznie chcesz ten string zapisywać i odczytywać to: odczytujesz getline(plik>>ws,bron);

    Widzę że zignorowałeś moją radę z menu w poprzednim temacie.

    0
  • #11 08 Lis 2015 20:27
    hellios890
    Poziom 10  

    Tablicami nie za bardzo umiem się posługiwać...
    To z getline(plik>>ws,bron); też nie działa.
    A co do tamtej rady... nie chciało mi się już tego zmieniać. Chociaż tamto menu o wiele lepsze to jestem tak leniwy że nie chciało mi się go odpowiednio modyfikować.
    W ogóle jestem chyba zbyt zielony na te c++ ale pytania to najlepsza forma nauki ^^

    @edit
    A i zapomniałem dodać że w tym kodzie co podałem jakby ktoś się zastanawiał to w funkcji zapisywanie kombinowałem z kodowaniem zapisu żeby potencjalny cheater nie edytował tak łatwo wartości.

    0
  • #12 08 Lis 2015 20:37
    Krawiec91
    Poziom 12  

    Sprawdzałem u siebie teraz. Użycie getline(plik>>bron); getline(plik>>tarcza) działa i nie ma żadnych problemów z kompilacją. Testowane z użyciem Code::Blocks 13.12.

    0
  • #13 08 Lis 2015 20:47
    hellios890
    Poziom 10  

    A mi wyrzuca błąd... Nie ogarniam
    @edit
    Znaczy to getline(plik>>ws,bron); działa tylko że też ucina Nie

    0
  • #14 08 Lis 2015 20:55
    -psiak-
    Poziom 32  

    hellios890 napisał:
    Tablicami nie za bardzo umiem się posługiwać...
    To się naucz bo zmniejszy to twój program wielokrotnie.
    hellios890 napisał:
    To z getline(plik>>ws,bron); też nie działa.
    Szklana kula pokazuje że błąd jest w okolicach wierszy 123..178. Chcesz bardziej precyzyjnie - pokaż kod.
    hellios890 napisał:
    Chociaż tamto menu o wiele lepsze to jestem tak leniwy że nie chciało mi się go odpowiednio modyfikować.
    Lenistwo w programowaniu się opłaca, jeżeli jesteś leniwy to jednak użyj tamto, bo zmniejszy ilość kodzenia wielokrotnie.
    hellios890 napisał:
    W ogóle jestem chyba zbyt zielony na te c++ ...
    Każdy kiedyś był zielony, więc to żaden argument do nieużywania przydatnych rzeczy.
    hellios890 napisał:
    ... ale pytania to najlepsza forma nauki
    Bzdura, dopiero próba użycia odpowiedzi jest formą nauki.
    hellios890 napisał:
    A i zapomniałem dodać że w tym kodzie co podałem jakby ktoś się zastanawiał to w funkcji zapisywanie kombinowałem z kodowaniem zapisu żeby potencjalny cheater nie edytował tak łatwo wartości.
    Zajmiesz się takimi pergolami na samym końcu, kiedy wszystko już będzie działać.

    0
  • #15 08 Lis 2015 20:58
    Krawiec91
    Poziom 12  

    Podaj treść błędu, jaki zwraca Ci kompilator.

    0
  • #16 08 Lis 2015 21:02
    hellios890
    Poziom 10  

    150 38 C:\Users\LegolaS\Documents\c++\main.cpp [Error] no matching function for call to 'getline(std::basic_istream<char>&)'
    150 38 C:\Users\LegolaS\Documents\c++\main.cpp [Note] candidates are:

    Cytat:
    ... ale pytania to najlepsza forma nauki
    Bzdura, dopiero próba użycia odpowiedzi jest formą nauki.

    To się zgadza tylko że to z tym że jestem zielony nie było usprawiedliwieniem tego że nie zastosowałem się do twojej rady. Masz w pełni rację jednak trochę źle zinterpretowałeś to co napisałem, lub to ja to napisałem nie zrozumiale.

    0
  • Pomocny post
    #17 08 Lis 2015 21:57
    Krawiec91
    Poziom 12  

    Chyba coś musiałeś zmienić w kodzie od pierwszego postu (coś usunąć). Bo jeśli we fragmencie kodu (funkcja wczytująca dane z pliku), który na początku tematu zamieściłeś, funkcja getline() nie powodowała zgłoszenia błędu przez kompilator, to usunięcie jedynie instrukcji plik>>bron; plik>>tarcza; z kodu nie powinno powodować zgłoszenia błędu z powodu getline().
    Skopiowałem cały kod, który zamieściłeś, usuwając jedynie plik>>bron; plik>>tarcza; z funkcji wczytującej dane, zostawiając tylko getline(). Działało z CodeBlocks 13.12, a po dodaniu #include <string> z C++ Builderem.

    @edit
    Co do postu #12 chodziło mi o getline(plik,bron); getline(plik,tarcza). Jeśli kogoś to wprowadziło w błąd, to bardzo przepraszam.

    0
  • #18 08 Lis 2015 22:11
    -psiak-
    Poziom 32  

    Z treści błędu wynika że zamiast: getline(plik,napis_do_wczytania); napisałeś: getline(plik);

    0
  • #19 09 Lis 2015 09:54
    hellios890
    Poziom 10  

    Dobra teraz działa nie wiem co dokładnie było problemem, ale po kilkukrotnym zmienianiu tej linijki kodu się udało.
    aktualnie jest teraz tak

    Kod: c
    Zaloguj się, aby zobaczyć kod

    czyli tak jak mówił psiak
    Dzięki wielkie wam obydwu za poświęcenie czasu.

    0