• 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)

VPS Starter Arubacloud
0 głosów
304 wizyt
pytanie zadane 10 stycznia 2022 w C i C++ przez WojtekS Początkujący (290 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 Mądrala (7,210 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 (290 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 (290 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 Mądrala (7,210 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 (194,920 p.)

Zamiast ignore lepiej dać manipulator ws:

plik >> i >> std::ws;

 

komentarz 10 stycznia 2022 przez toko Mądrala (7,210 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ź 117 wizyt
pytanie zadane 4 kwietnia 2018 w C i C++ przez Bartek Kotarski Początkujący (480 p.)
0 głosów
2 odpowiedzi 208 wizyt
0 głosów
1 odpowiedź 714 wizyt
pytanie zadane 11 stycznia 2017 w C# przez szpytma_1 Początkujący (340 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...