Forum » Programiranje » 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
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?
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
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?
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.
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
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.
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
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

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.
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!
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


BigWhale ::
V tisti soli se potem ucijo res totalni newbiji... Nekateri se vedno ne vedo kaj so spremenljivke... Upam da jih boste naucili... :)
--
BigW!
--
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??)
LP Brane
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??)

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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C++] vprašanja (strani: 1 2 3 4 5 6 7 8 9 )Oddelek: Programiranje | 28247 (12793) | aljazko1995 |
» | [naloga][c++] problemOddelek: Programiranje | 1604 (1432) | StajercSSS |
» | [C++][Naloga] Strukture - izpis po abecednem reduOddelek: Programiranje | 1569 (1409) | wat56 |
» | [C] čuden izpis iz txt dat. na zaslonOddelek: Programiranje | 1738 (1475) | l0g1t3ch |
» | C++ in tabeleOddelek: Programiranje | 3473 (3294) | BigWhale |