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

Problem z wczytaniem całej lini z tekstu w C++ (program wczytuje pojedyńcze słowa, zamiast całe linie)

Mały hosting, OGROMNE możliwości
0 głosów
875 wizyt
pytanie zadane 10 stycznia 2022 w C i C++ przez WojtekS Początkujący (310 p.)

Czołem, 

Mam problem ze swoim projektem w c++, całość jest praktycznie gotowa tylko program odmawia mi posłuszeństwa. Nie wiem co zrobić, by program wczytywał z pliku tekstowego całe linie, zamiast słowa ze zdania po kolei.

Poniżej zamieszczam wszystkie pliki z projektu jak i sam kod.

#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
#include <windows.h>
#include <string>
#include <chrono>
#include <thread>
#include <cmath>


#include "menu.hpp"






using namespace std;




int main()
{


Menu();

  return 0;
}






#ifndef WCZYTAJ_HPP
#define WCZYTAJ_HPP

#include "szukaj.hpp"


string line;

void Wczytaj()
{
  ifstream plik("wizyty.txt", ios::in);



 plik >> i;


int k=0;

  do
  {

    plik >>dane[k].id;
    plik >>dane[k].imie;
    plik >>dane[k].nazwisko;
    plik >>dane[k].typ;
    plik >>dane[k].data;
    plik >>dane[k].imieLekarza;
    plik >>dane[k].nazwiskoLekarza;
    plik >>dane[k].diagnoza;
    plik >>dane[k].leki;



    k++;
  } while (getline(plik,line) );
plik.close();
  cout <<"DANE WCZYTANO -> WCISNIJ ENTER <-";

  getchar();
}

#endif
#ifndef DODAJ_HPP
#define DODAJ_HPP



using namespace std;


struct przychodnia
{
  string id;
  string imie;
  string nazwisko;
  string typ;
  string data;
  string imieLekarza;
  string nazwiskoLekarza;
  string diagnoza;
  string leki;

};

przychodnia dane[50];

int i;



void Dodaj()
{
    cout <<"Podaj id wizyty " << endl;
    cin >> dane[i].id;

                        int liczba = dane[i].id.size();
                        if(liczba>50)
                            {
                                cout << "ID jest za dlugie! Sprobuj jescze raz" << endl;

                                cout << "=============================================" << endl;
                                exit(0);


                            }

    system("cls");

  cout <<"Podaj imie pacjenta: ";
    cin >> dane[i].imie;

    int liczba2 = dane[i].imie.size();
                        if(liczba2>128)
                            {
                                cout << "Imie jest za dlugie! Sprobuj jescze raz" << endl;
                               cout << "=============================================" << endl;
                                exit(0);
                            }


    system("cls");

  cout <<"Podaj nazwisko pacjenta: ";
    cin >>dane[i].nazwisko;

    int liczba3 = dane[i].id.size();
                        if(liczba3>128)
                            {
                                cout << "Nazwisko jest za dlugie! Sprobuj jescze raz" << endl;
                                cout << "=============================================" << endl;
                                exit(0);
                            }


        system("cls");

  cout <<"Podaj typ wizyty: ";
    cin >>dane[i].typ;

        system("cls");

    cout <<"Podaj date: ";
    cin >>dane[i].data;

        system("cls");

  cout <<"Podaj imie lekarza: ";
    cin >> dane[i].imieLekarza;

     system("cls");

 cout << "Podaj nazwisko lekarza: ";
    cin>> dane[i].nazwiskoLekarza;

    system("cls");

    cin.ignore();

    cout <<"Podaj diagnoze: ";
   getline(cin, dane[i].diagnoza);

    int liczba4 = dane[i].diagnoza.size();

                        if(liczba3>1000)
                            {
                                cout << "Nazwisko jest za dlugie! Sprobuj jescze raz" << endl;
                                cout << "=============================================" << endl;
                                exit(0);
                            }


    system("cls");


    cout <<"Podaj przepisane leki: ";
    cin >>dane[i].leki;



    system("cls");

  i++;

  cout <<" ->Wcisnij ENTER<-";
  getchar();
}


#endif
#ifndef ZOBACZ_HPP
#define ZOBACZ_HPP


void Zobacz()
{
    //Baza danych musi mieć mimum jedna pozycje, jesli to prawda - if wykona sie
  if ( i != 0)
  {
    for (int j = 0; j < i; j++)
    {
      cout <<"=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-="<<endl;
      cout <<"=     Wizyta nr "<<j+1<<": " << endl;
      cout <<"=     Id wizyty "<<dane[j].id << endl;
      cout <<"=     Imie pacjenta: "<<dane[j].imie << endl;
      cout <<"=     Nazwisko pacjenta: "<<dane[j].nazwisko << endl;
      cout <<"=     Typ uslugi: "<<dane[j].typ << endl;
      cout <<"=     Data: "<<dane[j].data << endl;
      cout <<"=     Imie lekarza: "<<dane[j].imieLekarza << endl;
      cout <<"=     Nazwisko lekarza: "<<dane[j].nazwiskoLekarza << endl;
      cout <<"=     Diagnoza: " <<dane[j].diagnoza << endl;
      cout <<"=     Przepisane leki: "<<dane[j].leki << endl;
      cout <<"=";
      cout <<"=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-="<<endl;


    }
  }
  else
  cout <<"Nie ma zadnej wizyty w bazie!";

  cout <<"Nacisnij ENTER";

  getchar();
}


#endif
#ifndef ZAPISZ_HPP
#define ZAPISZ_HPP



void Zapisz()
{
  ofstream plik("wizyty.txt", ios::out);

 plik <<i<<"\n";

  for (int j = 0; j < i; j++)
  {
    plik <<dane[j].id<<endl;
    plik <<dane[j].imie<<endl;
    plik <<dane[j].nazwisko<<endl;
    plik <<dane[j].typ<<endl;
    plik <<dane[j].data<<endl;
    plik <<dane[j].imieLekarza<<endl;
    plik <<dane[j].nazwiskoLekarza<<endl;
    plik <<dane[j].diagnoza<<endl;
    plik <<dane[j].leki<<endl;
  }



  cout <<"DANE ZAPISANE -> WCISNIJ ENTER <-";

plik.close();
  getchar();
}

#endif
#ifndef MENU_HPP
#define MENU_HPP


#include "dodaj.hpp"
#include "zobacz.hpp"
#include "zapisz.hpp"
#include "wczytaj.hpp"
#include "usun.hpp"
#include "edytuj.hpp"
#include "szukaj.hpp"


using namespace std;



void Menu()
{

    cout <<"===========================================" <<endl;
cout <<"                   INSTRUKCJA              " << endl;
cout <<"       (JESLI CHCESZ ZOBACZYC BAZE DANYCH)   " << endl;
cout <<"===========================================" <<endl;
cout <<"                  1.Dodaj wizyte ['1']           "<< endl;
cout <<"                  2.Zapisz wizyte ['3']          "<< endl;
cout <<"                  3.Wczytaj wizyte ['4']          "<< endl;
cout <<"                  4.Zobacz wizyte   ['2']         "<< endl;
cout <<"===========================================" <<endl;


  char wybor;

  do
  {
    cout <<"Aktualnie posiadasz "<<i<<" Pozycji"<<endl;
    cout <<"1. Dodaj wizyte "<<endl;
    cout <<"2. Zobacz wszystkie wizyty "<<endl;
    cout <<"3. Zapisz wprowadzone wizyty "<<endl;
    cout <<"4. Wczytaj wizyty z bazy "<<endl;
    cout <<"5. Usun wizyte"<<endl;
    cout <<"6. Edytuj wizyte "<<endl;
    cout <<"7. Szukaj wizyte " << endl;

    cout <<"8 - Koniec programu "<<endl<<endl;

  wybor = getch();

    system("cls");

    switch (wybor)
    {
      case '1': Dodaj();
      break;
      case '2': Zobacz();
      break;
      case '3': Zapisz();
      break;
      case '4': Wczytaj();
      break;
      case '5': Usun();
      break;
      case '6': Edytuj();
      break;
      case '7': Szukaj();
      break;

    }

    system("cls");
  } while (wybor != '8');





}




#endif

Może być zdjęciem przedstawiającym tekst „Pomo wizy wizyty.bt- txt Notatnik Plik Edycja Format Widok 3 ASD123 Wojtek Strycharz Szczepienie 12/12/2021 Jan Kowalski Chory i W ogóle Apap,gripex.itd”Może być zdjęciem przedstawiającym tekst „C:Users Admin Desktop ZROBIONMbinDebug PROJEKT ZROBIONY exe Wizyta Id wizyty ASD123 Imie pacjenta: wojtek Nazwisko pacjenta: Strycharz Typ uslugi: Szczepienie Data: 12/12/2021 Imie lekarza: Jan Nazwisko lekarza: Kowalski Diagnoza: Chory Przepisane leki: Tu powinno być napisane "chory no w ogole A pod spodem Apap,gripex,itd"”

1 odpowiedź

+2 głosów
odpowiedź 10 stycznia 2022 przez toko Dyskutant (8,370 p.)

Zamień wczytywanie w Dodaj przez cin >> string na getline(cin, string).

Również w Wczytaj zamień cin >> dane[k].coś na getline(plik, dane[k].coś) i zrób pętlę for od 0 do i, bo to co teraz masz jest trochę bez sensu i się zepsuje jak będzie więcej niż jedna osoba.

Również w Dodaj zrób zamiast int i, int i = 0, bo z tego co widzę nigdzie tego nie robisz, a to nie jest dobre wyjście. Nie wiem czy standard coś precyzuje na ten temat, nie wczytywałem się, jak to działa, ale jak nie będziesz zerował to się przyzwyczaisz, i potem będziesz miał gdzieś błędy.

Dodaj w Dodaj sprawdzanie, czy baza nie jest przepełniona (czy i jest >= 50), żebyś nie wychodził za tablicę, albo zrób tablicę dynamicznie i ją powiększaj (może być też jakiś kontener, np. std::vector)

komentarz 10 stycznia 2022 przez WojtekS Początkujący (310 p.)
edycja 10 stycznia 2022 przez WojtekS

Generalnie twoja rada pomogła, linia faktycznie się teraz wczytuje z pliku, ale narobiło to innych problemów. Program teraz przesuwa wszystko o jedną linie.

#ifndef WCZYTAJ_HPP
#define WCZYTAJ_HPP

#include "szukaj.hpp"


string line;




void Wczytaj()
{
  ifstream plik("wizyty.txt", ios::in);



 plik >> i;




  for(int k=0; k<=i; k++)
  {
    getline(plik, dane[k].id);
    getline(plik, dane[k].imie);
    getline(plik, dane[k].typ);
    getline(plik, dane[k].data);
    getline(plik, dane[k].imieLekarza);
    getline(plik, dane[k].diagnoza);
    getline(plik, dane[k].leki);
  }




plik.close();
  cout <<"DANE WCZYTANO -> WCISNIJ ENTER <-";

  getchar();
}

#endif

 

komentarz 10 stycznia 2022 przez WojtekS Początkujący (310 p.)

@toko, Dobra udało mi się to zrobić, problemem było to, że nie umiałem wczytać inta getlinem. Zrobiłem tak że wczytałem liczbe jako stringa, a potem zamieniłem na int. Wyszło troche patologicznie ale działa

#ifndef WCZYTAJ_HPP
#define WCZYTAJ_HPP

#include "szukaj.hpp"


string line;




void Wczytaj()
{
  ifstream plik("wizyty.txt", ios::in);


string  p;
getline(plik, p);

i=atoi(p.c_str());

for(int k=0; k<=i; k++)
{

    getline(plik, dane[k].id);
    getline(plik, dane[k].imie);
    getline(plik, dane[k].typ);
    getline(plik, dane[k].data);
    getline(plik, dane[k].imieLekarza);
    getline(plik, dane[k].diagnoza);
    getline(plik, dane[k].leki);
}


plik.close();
  cout <<"DANE WCZYTANO -> WCISNIJ ENTER <-";

  getchar();
}

#endif

 

komentarz 10 stycznia 2022 przez toko Dyskutant (8,370 p.)

Możesz zrobić tak jak wcześniej, ale dodać plik.ignore() przed pętlą.

plik >> i;
plik.ignore();
for(int k ...) {
    ...
}
plik.close();

Problem polega na tym, że wczytanie liczby, powoduje, że na wejściu zostaje '\n' (nowa linia), a ponieważ getline() czyta do '\n', to pierwszy ciąg jest właśnie do '\n' tuż po liczbie. plik.ignore() "usuwa" następny znak na wejściu, więc getline() przeczyta potem już następny element.

1
komentarz 10 stycznia 2022 przez j23 Mędrzec (195,220 p.)

Zamiast ignore lepiej dać manipulator ws:

plik >> i >> std::ws;

 

komentarz 10 stycznia 2022 przez toko Dyskutant (8,370 p.)

@j23, Racja. Nigdy tego nie używałem, ale jeśli dobrze rozumiem jak to działa, to tak faktycznie jest lepiej.

Podobne pytania

0 głosów
1 odpowiedź 195 wizyt
pytanie zadane 4 kwietnia 2018 w C i C++ przez Bartek Kotarski Początkujący (480 p.)
0 głosów
2 odpowiedzi 419 wizyt
0 głosów
1 odpowiedź 1,025 wizyt
pytanie zadane 11 stycznia 2017 w C# przez szpytma_1 Początkujący (340 p.)

93,718 zapytań

142,631 odpowiedzi

323,262 komentarzy

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

...