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

Plik - cin oraz getline

+1 głos
1,006 wizyt
pytanie zadane 17 kwietnia 2021 w C i C++ przez Doge Gaduła (3,420 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 (155,120 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,420 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,420 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 (155,120 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 (90,350 p.)
A jaka jest budowa pliku z danymi wejściowymi?
komentarz 17 kwietnia 2021 przez Doge Gaduła (3,420 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 (256,660 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,420 p.)
Wygląda to następująco:

"Nazwa filmiku
5
nie"

a otrzymuję

"

5

nie"
komentarz 17 kwietnia 2021 przez VBService Ekspert (256,660 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,640 wizyt
pytanie zadane 12 maja 2020 w C i C++ przez Maciex0n Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 1,628 wizyt
–1 głos
2 odpowiedzi 1,693 wizyt
pytanie zadane 31 stycznia 2018 w C i C++ przez niezalogowany

93,776 zapytań

142,736 odpowiedzi

323,388 komentarzy

63,381 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.

...