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

Plik - cin oraz getline

Object Storage Arubacloud
+1 głos
485 wizyt
pytanie zadane 17 kwietnia 2021 w C i C++ przez Doge Gaduła (3,370 p.)

WItam, mam następujący problem:

plik.open("filmiki_temp.txt", ios::in);
    plik2.open("filmiki.txt", ios::out | ios::app);
    while(plik>>temp_filmiki)
    {
        getline(plik, temp_filmiki); //nie wpisuje do pliku
        plik2<<temp_filmiki<<endl; //
        plik>>temp_filmiki_int;
        plik2<<temp_filmiki_int<<endl;
        plik>>temp_filmiki;
        plik2<<temp_filmiki<<endl;
    }
    plik2.close();
    plik.close();
    remove("filmiki_temp.txt");
    cout<<"Pomyslnie zapisano gre!"<<endl;

Przy użyciu powyższego kodu nie pobiera mi pierwszej linijki tekstu z pliku. W czym jest problem?

2 odpowiedzi

+1 głos
odpowiedź 17 kwietnia 2021 przez tangarr Mędrzec (154,860 p.)
wybrane 17 kwietnia 2021 przez Doge
 
Najlepsza

Instrukcja

while(plik>>temp_filmiki)

pobiera ze strumienia pierwsze słowo.

W buforze zostaje jednak znak nowej linii, który jest odczytywany jako pusta linia przez funkcję getline.

komentarz 17 kwietnia 2021 przez Doge Gaduła (3,370 p.)
A mam pytanie, dlaczego kiedy zrobię pętlę while przy pomocy "while(!plik.eof())" to na początku wpisuje dane, a później nieskończenie wiele razy wpisuje liczbę 0?
komentarz 17 kwietnia 2021 przez Doge Gaduła (3,370 p.)

Jednak teraz już się tak nie dzieje, nie wiem czym to było wcześniej spowodowane.

Tylko teraz mam taki problem, że otrzymuję pod koniec dodatkową liczbę.

Nazwa filmiku
5
nie

5

Dlaczego tak się dzieje?

komentarz 17 kwietnia 2021 przez tangarr Mędrzec (154,860 p.)

Nie otrzymujesz dodatkowej liczby, wyświetlasz poprzednią liczbę.
Dzieje się tak, ponieważ nie kontrolujesz tego co się dzieje w programie.

Pętla powinna wyglądać następująco:

    while(true)
    {
        // zmienne lokalne zamiast jakiś globalnych!
        std::string napis1, napis2;
        int liczba;

        getline(plik, napis1);
        plik >> liczba;
        plik >> napis2;
        
        if (!plik.good()) // jeżeli którakolwiek z operacji odczytu się nie powiodła
            break;

       plik2 << napis1 << endl;
       plik2 << liczba << endl;
       plik2 << napis2 << endl;
      
       // tu by się przydało sprawdzić czy zapis się powiódł
    }

 

0 głosów
odpowiedź 17 kwietnia 2021 przez SzkolnyAdmin Szeryf (86,360 p.)
A jaka jest budowa pliku z danymi wejściowymi?
komentarz 17 kwietnia 2021 przez Doge Gaduła (3,370 p.)
A jak sprawdzić budowę pliku? Bo się na tym za bardzo nie znam :/

Jeżeli chodzi o rozszerzenie to jest to plik tekstowy .txt

A jeżeli chodzi o to, co się znajduje w pliku, to jest to tekst ze spacjami, następnie liczba, a następnie pojedynczy wyraz.
komentarz 17 kwietnia 2021 przez VBService Ekspert (253,340 p.)

Czy tak?

Lorem ipsum dolor sit amet 3 Lorem 

czy ...

Lorem ipsum dolor sit amet, 3, Lorem 

czy może inaczej ...

podaj proszę, jak to wygląda.

komentarz 17 kwietnia 2021 przez Doge Gaduła (3,370 p.)
Wygląda to następująco:

"Nazwa filmiku
5
nie"

a otrzymuję

"

5

nie"
komentarz 17 kwietnia 2021 przez VBService Ekspert (253,340 p.)
edycja 17 kwietnia 2021 przez VBService

Czyli tak?

"Nazwa filmiku 5 nie"

w jednej linii, czy tak jak pokazałeś,

"Nazwa filmiku
5
nie"

bo to jest w 3 liniach, a to jest ważne, czy w jednej , czy w trzech.

Podobne pytania

0 głosów
1 odpowiedź 1,006 wizyt
pytanie zadane 12 maja 2020 w C i C++ przez Maciex0n Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 920 wizyt
–1 głos
2 odpowiedzi 1,084 wizyt
pytanie zadane 31 stycznia 2018 w C i C++ przez niezalogowany

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

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

...