» »

Primerjanje stringa in izpis v C++

Primerjanje stringa in izpis v C++

bmandelj ::

Lep pozdrav

v c++ sem naletel na majhen problem
je sigurno ena cist simpl fora sam jaz ne najdem resitve

v glavnem rad bi da mi program prebere ime iz datoteke in ga primerja z imenom ki sem ga vpisal (strcmp)
datoteka je txt in ima v eni vrsti napisanih se nekaj podatkov ki spadajo k imenu
vsako ime je v novi vrsti

evo kode

void iskanje (){

char izdatoteke[255]="";
char ime[255]="";

ifstream vhod ("datoteka.txt");

cout << "Vnesi ime: ";
cin >> ime;

if (strcmp (izdatoteke,ime)!=0) {
cout << "Tega podatka ni na voljo. Sorry!" << endl;
}

if (strcmp (izdatoteke,ime)==0) {
cout << izdatoteke << " ";
for (int counter=0; counter<5; counter++) {
vhod >> izdatoteke;
cout << izdatoteke << " ";
}
cout << endl;
}

}

ne vem kaj moram naredit da bo primerjal ime ki ga vpisem z imeni v filu

zmeraj mi da ven da podatka ni na voljo ceprav vem da je definitivno vpisan
skompilira mi brez problemov in tud vse ostalo dela cist lepo samo to mi povzroca probleme

tnx for help
LP Brane
There is no greater sorrow than to recall hapiness in times of misery....... Dante Aligheri

rasta ::

Si že ugotovil kakšno vrednost (če jo sploh ima) ima izdatoteke pred prvim if stavkom, takoj za cin << ime?

Pa kaj novega (kar že ne veš) preveriš v drugem if stavku?

bmandelj ::

ne erazumem te cist kaj si vprasal
sem se bolj zacetnik
v glavnem datoteka.txt zgleda nekje takole

ime naslov tel kraj
ime1 naslov1 tel1 kraj1

jaz mislim da se problem pojavi ker on ne ve da mora primerjat ime v datoteki (prvi stolpec) z imenom ki ga vnesem, oziroma jaz mu ne znam povedat kje dobi "izdatoteke".

prvi if stavek naj bi primerjal trenutni vnos z prvim stolpcem in ce ni nobenega ujemanja izpise ni zadetkov

drugi if pa izpise zadetke (ce so) z pripadajocimi podatki

LP Brane
There is no greater sorrow than to recall hapiness in times of misery....... Dante Aligheri

Zgodovina sprememb…

  • spremenilo: bmandelj ()

rasta ::

Če bi bolj pozorno pogledal kodo pred prvim if stavkom, bi ugotovil, da iz datoteke, ki jo odpreš sploh nič ne prebereš in potem primerjaš prazen string ("") s tistim kar si vnesel!

Ne bi namesto dveh if stavkov uporabil kar if - else, saj je jasno, da če ni od nič različno (!=0) je enako nič (==0). Zakaj bi za to porabili še kaj procesorskega časa?

napsy ::

bmandelj: najprej, zakaj narediš polje za kar 255 znakov in to celo 2x. Ni škoda rama? Uporabi potem raje dinamično alokacijo pomnilnika. Še bolje. Ker pišeš v c++, lahko uporabiš std::string, ki je posebni razred za delo z stringi. Tam ni treba teb nič dodelit pomnilnika pa še primerjava je lažja.

Potem je še pa druga stvar: moral boš nrdit parser, ki bo loču, kaj je ime pa naslov pa to v datoteki. Prebrat boš pa moral vrstico za vrstico in podatke najbolje, da shraniš v strukturo in nato tam preverjaš prebrane podatke iz datoteke in vnešene podatke, ki jih vnese uporabnik.

Spremenljivki izdatoteke, ime sta lokalni spremenljivki funkcije vhod() in ostalim funkcijam nista več vidni. Če želiš, da bota ti dve spremenljivki vidni pri vseh funkcijah, potem ju deklariri kot globalni. Pa zakaj kar dvakrat preverjaš, če je vnos imena enak imenu v datoteki. Raje pri funkciji vhod() vrni vrednost in potem v drugi funkciji preverjaj vrednost.
"If you die, you die. But when you live you live. There is no time to waste."

Zgodovina sprememb…

  • spremenil: napsy ()

bmandelj ::

Ne razumes
1. sem popoln n00b
2. to je sam tko za test
zadeva dela sam nekaj manjka in nikjer ne zvoham kaj

if (strcmp (izdatoteke,ime).....!=0....)

tukaj v if stavku nekaj manjka.....kaj? nimam pojma

LP Brane
There is no greater sorrow than to recall hapiness in times of misery....... Dante Aligheri

OwcA ::

@bmandelj: kar si ti napisal je nesmiselno.
Najprej prazen niz primerjaš z vhodom (skoraj gotovo se bosta razlikovala). Če nista enaka, se pritožiš.
Potem pa prebereš prvih pet nizov znakov v katerih ni "whitespaceov" (presledki, tabi, nove vrstice) iz datoteke in to izpišeš.
Skratka daleč od zaželjenega.

P.S. če se že igraš s C++ uporabi std::string namesto char.
Otroška radovednost - gonilo napredka.

bmandelj ::

No evo sem koncno pogruntal kako zadeva deluje

void iskanje (){

char ime[255]="";
char izdatoteke[255]="";

ifstream vhod ("blackbook.txt");

cout << "Vnesi ime: ";
cin >> ime;

while (strcmp (ime, izdatoteke)!=0 && vhod >> izdatoteke);
if (strcmp (ime, izdatoteke)!=0) {
cout << "Tega podatka ni na voljo. Sorry!" << endl;
}

if (strcmp (ime, izdatoteke)==0) {
cout << izdatoteke << " ";
for (int counter=0; counter<5; counter++) {
vhod >> izdatoteke;
cout << izdatoteke << " ";
}
cout << endl;
}
}

komentarji??

CU Brane
There is no greater sorrow than to recall hapiness in times of misery....... Dante Aligheri

Phoebus ::

Pravilno :p

rasta ::

Zadeva sicer deluje, vendar pa bi se dalo veliko reči glede optimizacije.

Pri branju spremenljivk preverjaj kaj si prebral (predvsem za overflowi, čeprav so v tvojem primeru zelo malo verjetni). In ne razmetavaj preveč s prostorom (char[255]).

Pri prvi while zanki: Prvič primerjaš prazen string in prebran podatek, šele nato izdatoteke prebereš. Nepotreben cikel.
Potem bereš kar vse po vrsti. Iz zgornjih postov je razvidno, da sekvenčno iščeš ime, ki je v seznamu datoteke, se pravi, da te zanima samo prvi niz v vsaki vrstici. Zakaj po prebranem prvem nizu ostanek vrstice preprosto ne zavržeš (in tako zmanjšaš število nepotrebnih ciklov), npr. z getline() metodo!?
Pa while zanka bi se ti s kakšno optimizacijo zaciklala, ker bi program po preverjanju prvega člena ugotovil, da false && nekaj == false in se drugega parametra (branja spremenljivke) sploh lotil ne bo.

Pri zadnjih dveh if stavkih: Kot sem že v prejšnjem postu rekel, drugič preverjaš že znano. Pa daj že uporabi ta if - else. Koda je s tem preglednejša in hitrejša.
Pa pri drugem if stavku čisto nepotrebno kompliciraš z izpisovanjem vrstice oz. opravljaš nepotrebno. Vrstico prebereš z getline() metodo in nato celo izpišeš (saj je formatirano že v datoteki iz katere prebereš?).

Pa kakšno preverjanje konca datoteke (EOF) tudi ne bi škodilo ...


Nauči se pisati lepo in hitro kodo, ker s slabo kodo boš nezmožen napisati kaj bolj kompleksnega od tega, ki si ga podal.

Zgodovina sprememb…

  • spremenil: rasta ()

BigWhale ::

Najprej se nauci uporabljat tipko tab... ;) Tvoja koda bo dejansko berljiva in cez pol ure bos tudi sam vedel kaj si napisal... ;>

Moj nasvet, se enkrat premisli kaj si hotel napisati in kaj si hotel narediti. Dvakrat izvajas strcmp()... Da o tem, da strcmp() ne bi smel NIKOLI klicat. V najslabsem primeru bi klical strncmp(), kjer bi vsaj range checking pocel.

IMO je lepse ce napises:

if (strncmp(str1, str2, sizeof(str1))
{
do_strings_not_equal_stuff();
} else {
do_something_else();
}

Kot pa da se tisti == 0 notri tlacis :)

--
BigW!

Phoebus ::

Fantje, to je blo vprasanje iz kiberpipine c++ sole, tam se nismo prisli do dinamicne alokacije. pocasi je treba napredovat, da se ljudem ne zameri :D

BigWhale ::

V tisti soli se potem ucijo res totalni newbiji... Nekateri se vedno ne vedo kaj so spremenljivke... Upam da jih boste naucili... :)

--
BigW!

bmandelj ::

Tako je BigWhale

drugace sem ze u startu povedal da sem POPOLN zacetnik

ampak nekje je treba zacet a ne
mislim da ni nobeden tukaj ze od rojstva znal programirat
(ali pa??)

:D

LP Brane
There is no greater sorrow than to recall hapiness in times of misery....... Dante Aligheri

OwcA ::

@bmandelj: vse lepo in prav, ampak če se boš naše ves čas gledal kot na začetnika in se s tem opravičeval, ne boš nikoli postal kaj več kot začetnik. Dobro si oglej, kaj vse smo ti predlagali in se malo igraj s kodo. Če ti kaj ni jasno vprašaj, niakor pa ne bodi zadovoljen samo s tem, da dela. Treba je misliti še na estetiko. ;)
Otroška radovednost - gonilo napredka.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] vprašanja (strani: 1 2 3 4 5 6 7 8 9 )

Oddelek: Programiranje
44728247 (12793) aljazko1995
»

[naloga][c++] problem

Oddelek: Programiranje
91604 (1432) StajercSSS
»

[C++][Naloga] Strukture - izpis po abecednem redu

Oddelek: Programiranje
91569 (1409) wat56
»

[C] čuden izpis iz txt dat. na zaslon

Oddelek: Programiranje
121738 (1475) l0g1t3ch
»

C++ in tabele

Oddelek: Programiranje
113473 (3294) BigWhale

Več podobnih tem