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

C++ - wymuszenie uzycia funkcji getline z konkretnego pliku naglowkowego

Object Storage Arubacloud
0 głosów
634 wizyt
pytanie zadane 27 kwietnia 2016 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)
edycja 27 kwietnia 2016 przez Sinnley

Witam, pisze program w c++ z operacjami na plikach. Dołączyłem następujące nagłówki:

#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
#include <conio.h>



Problem polega na tym, ze chcialbym uzyc funkcji

getline();


Wiem, ze funkcje o takiej nazwie zawiera zarowno istream jak i fstream.

Kiedy próbuję użyć funkcji w ten sposob:
 

getline(cin, zmiennastring)



Instrukcja jest po prostu pomijana. Funkcja getline zczytująca z pliku do zmiennej działa poprawnie.

Co powinienem zrobić?

3 odpowiedzi

+3 głosów
odpowiedź 27 kwietnia 2016 przez Sedi Stary wyjadacz (10,200 p.)
wybrane 27 kwietnia 2016 przez Sinnley
 
Najlepsza

Zapewne przed użyciem getline użyłeś zwykłego wczytywania. Getline ignoruje znaki białe, aż do napotkania znaku nowej linii, które w Twoim wypadku zostaje "pobrane" ze zwykłego cina. Rozwiązaniem jest oczyszczenie strumienia wejściowego poprzez instrukcję std::cin.ignore();

W Twoim przypadku zadziała ot np taki kod:

#include <iostream>
#include <limits>
using namespace std;

int main()

{

    string text;
    std::cin>>text;
using Limits=std::numeric_limits<streamsize>;
std::cin.ignore(Limits::max(),'\n');
std::getline(std::cin,text);

    return 0;
}

Jak to działa ?

numeric_limits<streamsize>;<- pobiera długość strumienia 

std::cin.ignore(Limits::max(),'\n');//Ignorowanie znakow, az do znaku nowej linii

I voila działa

komentarz 27 kwietnia 2016 przez Sinnley Stary wyjadacz (12,810 p.)
Wyskakuje: 'Limits' has not been declared.
komentarz 27 kwietnia 2016 przez Sedi Stary wyjadacz (10,200 p.)

Używasz standardu C++98 ?:) 

W Code Block: Wejdź w Setting-> Compilers i ustaw C++11, lub C++14 i powinno śmigać. To using Limits jest dodane trochę na wyrost i jest "aliasem", czyli krótszą wersją. W tym wypadku std::numeric_limits<streamsize>

 

Pozdrawiam ;]

komentarz 27 kwietnia 2016 przez Sinnley Stary wyjadacz (12,810 p.)

Hej, faktycznie C++98.

To przy okazji wyjasnia czemu aliasy mi nie dzialaly :D

Dodatkowo znalazłem inny sposób na pozbycie się błędu.

Zastasowalem

cin.clear();
cin.sync();

Jaka jest różnica pomiędzy tym rozwiązaniem w kwestii czyszczenia bufora strumienia, a twoim?

komentarz 27 kwietnia 2016 przez Sedi Stary wyjadacz (10,200 p.)
Myślę, że jeśli trochę oderwiesz się od języka polskiego, to poćwiczysz angielski:

http://stackoverflow.com/questions/10585392/the-difference-between-cin-ignore-and-cin-sync

Powyżej jest rozwiązanie do Twojego pytania ;]

Pozdrawiam ;]
komentarz 27 kwietnia 2016 przez Sinnley Stary wyjadacz (12,810 p.)
Hehe, zwykle zaglądam własnie tam, ale kiedy mózg mi już paruje wole poszukać pomocy po polsku, żeby nie walnąć jeszcze posta po angielsku używając gdzieniegdzie niemieckich słow, kiedys mi sie tak zdarzylo, bylem wtedy baaardzo zmeczony :D

Tak czy siak dzięki za pomoc, ciasteczko dla ciebie :)
komentarz 27 kwietnia 2016 przez Sedi Stary wyjadacz (10,200 p.)
Przyjemność po mojej stronie !

Miłej nauki i oby więcej takich ludzi ;)
+1 głos
odpowiedź 27 kwietnia 2016 przez Patrycjerz Mędrzec (192,320 p.)

A używasz wcześniej strumienia std::cin? Jeśli tak, to wyczyść bufor przed użyciem getline:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

 

komentarz 27 kwietnia 2016 przez Sinnley Stary wyjadacz (12,810 p.)
Jaka jest różnica pomiędzy tym a:

cin.clear();

cin.sync();

?
0 głosów
odpowiedź 27 kwietnia 2016 przez Sinnley Stary wyjadacz (12,810 p.)

Po bliższych oględzinach zauważyłem, że funkcja

getline(cin,zmienna);

dziala dopoki nie otworze pliku, potem juz nie.

Podobne pytania

0 głosów
1 odpowiedź 278 wizyt
pytanie zadane 15 maja 2017 w C i C++ przez pako217 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 656 wizyt
pytanie zadane 20 grudnia 2016 w C i C++ przez Don Corleone Obywatel (1,210 p.)
0 głosów
2 odpowiedzi 393 wizyt

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

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

...