Naredba cin.ignore()

poruka: 18
|
čitano: 7.784
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
neaktivan
offline
Naredba cin.ignore()

Pozdrav,

 

Da li mi moze netko rec pravilnu upotrebu naredbe cin.ignore() za praznjenje ulaznih tokova kod unosa u petlji?

 

npr. ako stavim ovako

 

cin.ignore();

cout<<"Ime i prezime kandidata: ";

cin.getline(k.ime_prez,20);

 

onda u konzoli pri izvrsavanju zastane na jedan red dok ne stisnem enter ali uspjesno ucita

 

cout<<"Ime i prezime kandidata: ";

cin.ignore();

cin.getline(k.ime_prez,20);


Ako stavim ovako onda se normalno izvrsava ali ne zabiljezi prvi znak, npr ako napisem forum on ucita orum
ako ne stavim nista onda nikako ne valja tako da moram neku naredbu za ciscenje toka koristit.

 

ako netko zna molio bih da napise

Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: Naredba cin.ignore()

Pogledaj malo ovaj link.

Private
17 godina
neaktivan
offline
RE: Naredba cin.ignore()

To sam vec probao prije i na tom primjeru radi ali kad primjenim na moj nece. koliko sam skuzio u zagrade od ignore ide deklarirana duljina prethodnog stringa i terminator /n

 

ako to primjenim na ovom primjeru izmedu svakoga pri izvrsavanju treba vise puta stiskati enter dok se ne pojavi opcija unosa

 

cout<<"Ime i prezime : ";

cin.getline(k.ime_prez,20);

 

cin.ignore(20,'/n');

cout<<"OIB : ";

cin.getline(k.oib,15);

 

cin.ignore (15,'/n');

cout<<"Naziv stranke: ";

cin.getline(k.stranka, 30);

17 godina
neaktivan
offline
RE: Naredba cin.ignore()
Dajte ljudi lud sam vise s ovim ako netko zna nek pomogne
16 godina
neaktivan
offline
RE: Naredba cin.ignore()

tek ucin c++ pa me zainteresiralo kako niko nije rjesia a par dana je proslo.

 

Cini mi se da san rjesia problem

Ako san dobro svatia zelia si da kad se unese ima prezime i klikne enter trazi odma unosenje oib-a bez da 10 puta stisces enetr ???

Testa san program bez razreda ali ista stvar trebalo bi radit.

 

Evo kako je meni proslo:

 

cout<<"Ime i prezime : ";
cin.get(k.ime_prez,20);


cin.ignore(20,'\n');
cout<<"OIB : ";
cin.get(k.oib,15);

 
cin.ignore (15,'\n');

cout<<"Naziv stranke: ";
cin.getline(k.stranka, 30);

 

btw di je funkcija kad se unosi kod ???

Poruka je uređivana zadnji put sub 19.12.2009 20:27 (Orinem).
17 godina
neaktivan
offline
RE: Naredba cin.ignore()

Hvala na odgovoru, ali ne vidim bas po cemu je tvoj kod razlicit od mog. meni se cini identican. Kako mislis unos koda? Ovaj cin.ignore mi stvara velike probleme a ocito je problematican i drugima kad nema bas odgovora na postavljen problem

 

EDIT:

 

sad sam tek vidio razliku ti si koristio get umjesto getline. Da li znas mozda koja je razlika izmedu ta 2?

Poruka je uređivana zadnji put sub 19.12.2009 17:16 (mdax).
16 godina
neaktivan
offline
Naredba cin.ignore()

Nemoj koristiti cin.ignore() ako ti stvara probleme, jednostavno koristi nesto kao:

 

cout<<"Ime i prezime kandidata: "<<endl;

ili

cout<<"Ime i prezime kandidata: "<<flush;

 

Razlika izmedu endl i flush je ta sto endl stvara novi red pa 'cisti' buffer a

flush samo 'cisti' buffer.

All religions are the same: religion is basically guilt, with different holidays.
 
0 0 hvala 0
17 godina
neaktivan
offline
RE: Naredba cin.ignore()

Hvala na savjetu ali opet se javljaju neki problemi. Vidim da se uz flush treba koristiti cin.getline jer cin.get ne radi. a glavni problem je sljedeci. ovdje se radi o binarnim datotekama, dakle prvo se ucitavaju podatci o svakom kandidatu i nakon svakog postavlja se pitanje o daljnjem unosu. ako je odgovor da unosi se sljedeci itd. kad je odg ne ispisu se svi uneseni i izvrsava se funkcija za pretragu po oibu. ako nade kandidata u datoteci ga ispise sa njegovim podatcima, ako ne napise da ga nema i ponudi upis. e sad problem je sto kad koristim cin.get ili cin.getline sa flush mogu pronaci samo prvog unesenog, a za ostale javlja da ih nema u datoteci. evo kod kakav je bio prije testiranja sa vasim prijedlozima pa ako netko zna kako bih mogao to popraviti molio bih neka napise,

 

#include <iostream>

#include <fstream>

 

using namespace std;

 

struct kandidat

{

char ime_prez[20];

char oib[15];

char stranka[30];

char d_krug;

int postotak;

}k;

 

char datoteka[30];

 

void kreiraj()

{

fstream d;

 

cout<<"unesi ime datoteke: ";

cin.getline (datoteka, 30);

 

d.open (datoteka, ios::in | ios::binary);

 

if(!d)

{

d.open (datoteka, ios::out | ios::binary);

d.close();

}

else

{

cout<<"Datoteka "<<datoteka<<" vec postoji.";

d.close();

}

}

 

 

void upis()

{

fstream d;

char next;

 

d.open (datoteka, ios::out | ios::ate | ios::binary);

 

do

{

cin.ignore();

cout<<"Ime i prezime kandidata: ";

cin.getline(k.ime_prez,20);

 

cin.ignore();

cout<<"OIB kandidata: ";

cin.getline(k.oib,15);

 

cout<<"Naziv stranke kandidata: ";

cin.getline(k.stranka, 30);

 

cout<<"Da li se kandidat plasirao u 2. krug (d-DA, n-NE): ";

cin>>k.d_krug;

 

if (k.d_krug=='d')

{

cout<<"Unesite postotak glasova: ";

cin>>k.postotak;

}

 

d.write ((char*)&k, sizeof(k));

 

cout<<endl<<"Da li zelite dalje unositi (d-DA, n-NE): ";

cin>>next;

 

cout<<endl<<endl;

 

}while (next=='d');

 

d.close();

}

 

 

void ispis()

{

fstream d;

 

d.open (datoteka, ios::in | ios::binary);

 

while (d.read ((char*)&k, sizeof(k)))

{

cout<<endl<<endl;

cout<<"Ime i prezime kandidata: "<<k.ime_prez<<endl;

cout<<"OIB kandidata: "<<k.oib<<endl;

cout<<"Stranka kandidata: "<<k.stranka<<endl;

if (k.d_krug=='d')

cout<<"Kandidat se plasirao u drugi krug sa osvojenih "<<k.postotak<<" %"<<endl;

else

cout<<"Kandidat se nije plasirao u drugi krug."<<endl;

}

 

d.close();

}

 

void pretrazi()

{

fstream d;

char oib[15];

 

cout<<endl<<endl;

 

cout<<"Unesite OIB trazenog kandidata: ";

cin.ignore();

cin.getline(oib,15);

 

bool naden=false;

 

d.open (datoteka, ios::in | ios::binary);

 

while (d.read ((char*)&k, sizeof(k)))

{

if (strcmp (k.oib, oib)==0)

{

naden=true;

 

cout<<endl<<endl;

 

cout<<"Ime i prezime kandidata: "<<k.ime_prez<<endl;

cout<<"OIB kandidata: "<<k.oib<<endl;

cout<<"Stranka kandidata: "<<k.stranka<<endl;

 

if (k.d_krug=='d')

cout<<"Kandidat se plasirao u drugi krug sa osvojenih "<<k.postotak<<" %"<<endl;

else

cout<<"Kandidat se nije plasirao u drugi krug."<<endl<<endl;

break;

}

 

d.close();

}

 

if (!naden)

{

cout<<"Trazeni kandidat se ne nalazi u datoteci."<<endl<<endl;

upis()

}

}

 

void main()

{

kreiraj();

upis();

ispis();

pretrazi();

}

16 godina
neaktivan
offline
Naredba cin.ignore()

Da li znas mozda koja je razlika izmedu ta 2?

 

cin.getline pojede onaj granicni znak dok ga cin.get ostavlja u buffer-u to bi tako izgledalo teoretski.

 

Istu stvar koju san napisa gore san cin.get mozes napisat i sa cin.getline prakticno razlika izgleda ovako

 

ako koristis cin.get(string, duzina niza) i iza obavezno moras navest cin.ignore(duzina niza, \n) da bi to funkcioniralo kako terba

 

dok sa getline da bi dobia isti efekt trebas napravit nesto ovako

 

string Moj_string;

getline(cin, Moj_string);

 

Kako je kod postan nemogu se nista snac :( a jos manje u onom djelu di opisujes sta treba radit (Probaj odvajat stvari u paragrafe )

 

Proban skuzit o cem se radi pa onda postan.

Poruka je uređivana zadnji put sub 19.12.2009 22:23 (Orinem).
 
0 0 hvala 0
17 godina
neaktivan
offline
RE: Naredba cin.ignore()

ma inace je to sve odjeljeno u paragrafe ali kad postam kaze da nesto nevalja sa formatiranjem teksta pa moram ovako.

 kod je podjeljen u funkicje ciji naziv opisuje cemu sluze pa mozda skuzis nesto.

kada probam sa cin.get i sa ignore (duljina, '/n') radi sve ali kad u funkciji trazi pokusam nac odredeni string kaze da ga nema u datoteci iako sam ga upisao.

kada to isto radim sa cin.getline onda radi ali cin.ignore mora imat prazne zagrade () inace isto ne radi. sa praznim zagaradama radi ali izmedu unosa u konzoli trazi duplo stiskanje entera. nije to neka greska ali kad vec ucim htio bi naucit kako spada.

citao sam razne knjige i tutoriale ali rijetki spominju bas to u detelje. ono malo sta sam nasao sam isprobao kako pise ali uvijek negdje zapne. zamolio bih clanove foruma koji se razumiju da probaju objasnit o cemu se tu radi i kako je najbolje napisat kod za unos vise stringova za redom, tj kako je najbolje ocistit ulazni tok izmedu njih

16 godina
neaktivan
offline
Naredba cin.ignore()

i ja ucin i neznan jos nista o ovome pa ti nemogu pretjerano pomoc ali evo nekih stvari koje san uspia.

 

sa cin.get u kombinaciji sa cin.ignire sve radi ka sta bi trebalo (sa onin kako san prepravia cili kod) i sve mi oibe nadje bez problema kad trazin kandidata po oib-u samo nemoze sve ic kao bi trebalo bez problema pa tako ni ode.

 

naime sa ovin kako san ja napisa sve radi kako terba ako recimo pokrenen program unosin 10 kandidata i onda trazin oib nekoga od tih kandidata nadje ga ali ako zatvorin program upisen istu datoteku ostali kandidati kao da se izgube. Kako znan puno manje nego ti a o datotekama nista neznan ocu li i taj detalj uspit ispravit inace sve ostali radi kako terba.

 

btw imas par bugova u programu tipa da nepazis ako se unesu 2 kandidata sa istin oibon (jedina stvar po kojoj ih sigurno mozes razlokovat) ostale se nekim slucajem i mogu poklopit pa bit iste. Jos jedan vazan detalj je da sa ovin funkcijama ti ubiti ucitavas stringove a ne brojeve pa tako i za oib sta bi znacilo da ako za oib uneses neki tekst tipa (fdsfa) on ce to prihvatit.

 

EDIT: Tebi nemoze nac kandidata po oib-u sa getline jer ti ubiti uopce neunosis iob nego daj dio program preksoci i ide na iducu funkciju

 

evo skuzia san i zasto meni nemoze nac kandidata pri drugom otvaranju iste datoteke.

Datoteka pri drugom otvaranju ti se skroz pobrise i postoji samo ime aunutar nema nista. Probaj unit kandodata jednoga odna zatvorit program unit drugoga kandidata i prati koliko datoteka ima bajt-a kad uneses provoga 72 kad opet pokrenes program 0 sta znaci da se cijeli njen sadrzaj izbrise.

 

Ka sta san gore navea o datotekama neznan nista pa rpoblema pri drugom otvaranju nemogu rjesit :(

Poruka je uređivana zadnji put sub 19.12.2009 23:01 (Orinem).
 
0 0 hvala 0
17 godina
neaktivan
offline
RE: Naredba cin.ignore()

Ma da ovo ni ne sluzi da sprema datoteke kako treba, znam da ima gresaka i treba ga optimizirat ali to mi nije toliki problem nego sam zapeo sa tim ucitavanjem pa ocu to rjesit prije nego idem dalje. meni nade samo prvog clana kad trazim po oibu, npr ako ih stavim 10 za prvog ce nac a za ostalih 9 ce rec da ih nema u datoteci,

Znaci koliko sam skuzio ti si umjesto svih cin.getline koristio cin.get u kombinaciji sa cin.ignore (duljina prethodnog, '/n') i uspjelo ti je da nade bilo koji uneseni? to sam vec probao pa nije bas radilo to trazenje. probat cu opet.
U svakom slucaju hvala na pomoci

 

EDIT

 

Evo uspjelo ovako kako si ti napravio sad sve dobro radi osim tog pretrazivanja. I dalje samo prvi mogu nac za sve druge kaze da ne postoji

Poruka je uređivana zadnji put ned 20.12.2009 0:41 (mdax).
16 godina
neaktivan
offline
Naredba cin.ignore()

Ma cek nzn jel ti to slucajno stavljas ali neide ti /n nego \n (novi red)

Ako stavis /n nzn kako ti kompajler to uopce prihvati trebas stavit \n i to u navodnike sta bi izgledalo ovako "\n"

 

Jos nesto sta san zapazia kod toga koda kako si ti pisa ti bi ucitava nesto i onda prije iducega ucitavanja stavlja cin.ignore ovako nama naoko nepostoji razlika ali u kodu je ima u prelazenju iz funkcije u funkciju jer ako stavis prije program nista neradi kako treba bar meni nije.

 

Ja stavin cin.get i ignore kad je u pitanju nesto jednostavno i znan da necu imat komplikacija inace kad mislis da ce ih bit koristi provjereno odnosno stavljaj string umisto polja char-ova. Cini mi se cak da san negdi naletia kako pretovorit string u niz char-ova ako ti zatreba taj oblik.

 

string nesto;

getline(cin, nesto);

 

evo kako san ja rjesia problem sa cin.get

 

http://pastebin.com/m5c27341a

 
0 0 hvala 0
17 godina
neaktivan
offline
RE: Naredba cin.ignore()
Tako sam i ja probao jucer, ali opet izmedu unosa imena datoteke i pocetka unosa kandidata ima praznina cega se zelim rjesit i opet ne radi pretrazivanje bilo kojeg unesenog osim prvog. Svarno sam vise lud s ovim. A ovo sta kazes razlika /n i \n, to je greska u postanju u kodu naravno nije tako
16 godina
neaktivan
offline
RE: Naredba cin.ignore()

Ta praznina koja ti se pojavljuje izmedju ti je od funkcije unos. paste-aj moj kod kompajliraj i nac ce ti bio kojega unija ga petoga ili sedmoga (osim ako ih neunosis sa istin oibon i zelis da ih nadje sve u tom slucaju ti je kriv kod za pretrazivanje datoteke)

17 godina
neaktivan
offline
RE: Naredba cin.ignore()

Pa tvoj sam i isprobao i nece da nade nista osim prvog unesenog. ne unosim iste oib-ove i normalno da ih ne trazim vise za to nije ni napravljeno.

Evo stavio sam sliku, unesem 2 i drugi nemogu nac, javi da ga nema u datoteci 

 

 

Poruka je uređivana zadnji put ned 20.12.2009 14:31 (mdax).
16 godina
neaktivan
offline
RE: Naredba cin.ignore()
mdax kaže...

Pa tvoj sam i isprobao i nece da nade nista osim prvog unesenog. ne unosim iste oib-ove i normalno da ih ne trazim vise za to nije ni napravljeno.

Evo stavio sam sliku, unesem 2 i drugi nemogu nac, javi da ga nema u datoteci 

 

 

Pa nema ga u datoteci zato sto ne citas iz datoteke osim za prvi unos! Sad sam bacio oko na tvoj kod, i greska je poprilicno jednostavna.

Tako da bi trebao samo oznaceni dio izbaciti iz petlje tj. premjestitit van nje.

 

while (d.read ((char*)&k, sizeof(k)))

  {

  if (strcmp (k.oib, oib)==0)

   {

    naden=true;

    cout<<endl<<endl;

    cout<<"Ime i prezime kandidata: "<<k.ime_prez<<endl;

    cout<<"OIB kandidata: "<<k.oib<<endl;

    cout<<"Stranka kandidata: "<<k.stranka<<endl;

 

    if (k.d_krug=='d')

        cout<<"Kandidat se plasirao u drugi krug sa osvojenih "<<k.postotak<<" %"<<endl;

    else

        cout<<"Kandidat se nije plasirao u drugi krug."<<endl<<endl;

 

    break;

    }//~if

 

d.close(); // datoteku zatvaras pri prvom prolazu petlje, a iz zatvorene datoteke ne mozes citati, jelda !?

}//~while

 

P.S. I dalje ne vidim nikakvu potrebu koristenje cin.ignore() u tvom slucaju, najobicniji endl poslije ispisa je i vise nego dovoljan.

All religions are the same: religion is basically guilt, with different holidays.
Poruka je uređivana zadnji put ned 20.12.2009 15:27 (drnde).
17 godina
neaktivan
offline
RE: Naredba cin.ignore()
mislis cin.ignore () u funkciji za pretrazivanje? da taj ne mora bit tu ali oni ostali trebaju. Uopce nisam pazio na taj d.close(), evo sad radi sve hvala na savjetu
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice