Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

printf() u C++ - svetogrđe?

[es] :: C/C++ programiranje :: printf() u C++ - svetogrđe?

[ Pregleda: 3293 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Milos Stojanovic
Belgrade

Član broj: 10343
Poruke: 1864
*.rcub.bg.ac.yu.

ICQ: 282954730
Sajt: www.sietf.org


+7 Profil

icon printf() u C++ - svetogrđe?03.12.2004. u 14:30 - pre 235 meseci
Ovo je pomenuto u raspravi o razdvajanju C i C++ u posebne forume, pa nisam hteo da stvaram šum u toj temi, zato sam otvorio drugu.
Nisam dugo u svetu C/C++ programiranja (možda nekih 2,3 godine), tako da se nisam toliko obazirao na neke razlike u C i C++ programiranju. Mislio sam - ako mi je potreban objektni kod, to je C++, ako nije, onda je to C. Međutim, sada čitam neke stvari koje me pomalo čude, pa bih voleo da čujem neki dobar savet, da bih znao u kom smeru da se učim ispravnim radom u C++u.

Da li je zaista tolika greška korisiti printf(), char*, malloc u C++, ili je to samo pitanje nekog bontona i konvencije pisanja čistih C++ programa?
Meni je nekako uvek bilo zgodnije da koristim char* umesto stringa, lakše da koristim formatizovan input printf-a nego cin, itd. Da li je to greška, tj. da li se treba po svaku cenu prebaciti?
ex. trooper
Oh goody... it's my Illudium PU-36 Explosive Space Modulator!
Softversko Inženjerstvo
♪♫♪
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
66.228.70.*



+6 Profil

icon Re: printf() u C++ - svetogrđe?03.12.2004. u 14:42 - pre 235 meseci
Da citiram B. Stroustrupa ("Design and Evolution of C++"):

Citat:
I strongly felt then, as I still do, that there is no one right way of writing every program, and a language designer has no business trying to force programmers to use a particular style. The language designer does, on the other hand, have an obligation to encourage and support a varietly of styles and practices that have proven effective and to provide language features and tools to help programmers avoid the well-known traps and pitfalls.


Znači, kad smatraš da je bolje koristiti printf, malloc, char*, koristi ih i nemoj da te grize savest. Međutim, grehota bi bilo da ignorišeš moderne C++ tokove čisto iz navike ili tvrdoglavosti. Standardna biblioteka, kao i druge moderne C++ biblioteke (Boost i sl) umeju jako da olakšaju posao i moje ubeđenje je da jedino takav "modernizovani" C++ ima budućnost u razvoju aplikacija. Baratanje sa char*, pointer aritmetika i druge lepote C-a i dalje imaju svoju primenu u specifičnim okolnostima, ali u opštem slučaju mislim da ih ima smisla koristiti samo kad moderne varijante iz nekog razloga ne vrše posao ili ih je nemoguće primeniti (npr kernel-mode programiranje).
 
Odgovor na temu

NeznamTkoSam

Član broj: 39660
Poruke: 279
*.cmu.carnet.hr.



Profil

icon Re: printf() u C++ - svetogrđe?03.12.2004. u 20:57 - pre 235 meseci
A sto mislis, da su C++ ucinili kompatibilnim s C samo tako, jer im je bila volja?
Naravno, da se ne prelazi na novi jezik, ali i C ima svoje prednosti.
Meni, osobno, vise se svidja printf jer mrzim manipulatore u cout.
 
Odgovor na temu

vladab
Vladimir Bašanović
Beograd

Član broj: 9512
Poruke: 498
*.vdial.verat.net.



Profil

icon Re: printf() u C++ - svetogrđe?04.12.2004. u 07:09 - pre 235 meseci
Mislim da nije svetogrdje, ali ... Recimo, zasto bih ja koristio nizove u C++, ako mi vektori resavaju problem. A sta dobijam time: ne moram da razmisljam o dealokaciji (i alokaciji) memorije, smanjuje mi se mogucnost greske itd. Pogledaj http://www.elitesecurity.org/tema/73781
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.adsl.versatel.nl.

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: printf() u C++ - svetogrđe?04.01.2005. u 23:56 - pre 234 meseci
Citat:
Ali sta cemo kada nam treba brzina programa, a ne elegantnost koda? :)
Program prvo treba da bude ispravan, pa tek onda brz.

IMHO nijedno programersko društvo ne kontrira principima dobrog softverskog inženjerstva više od C programera koji su bućnuli u C++ vode. Nikad neću shvatiti zašto bi neko, umesto da odradi stvar u dva reda kao u gornjoj poruci, pisao svoje rutine za učitavanje znakova, sagubio bar pola sata na trebljenje slučajnih grešaka i posle par meseci se iznenadio pošto je sasvim slučajno ugradio i buffer overrun bag u svoj program.

f
 
Odgovor na temu

Microsoft
Split

Član broj: 41316
Poruke: 31
*.cmu.carnet.hr.



Profil

icon Re: printf() u C++ - svetogrđe?13.01.2005. u 16:03 - pre 233 meseci
Inace , scanf i printf se koristi (bar na natjecanjima) jer se osjete razlike u vremenu ako imas dosta ucitavanja ...Npr kod ucitavanja ogromnih nizova i matrica...Pozdrav
 
Odgovor na temu

ivbrcic
Ivan Brcic
Siemens
Zagreb

Član broj: 38567
Poruke: 35
*.siemens.at.



Profil

icon Re: printf() u C++ - svetogrđe?14.01.2005. u 14:35 - pre 233 meseci
Moj savjet ti je da sto je moguce vise postujes pravila igre, a to znaci ako pises programe u c-u onda koristi printf i dr., a kada pises programe u c++-u onda koristi cout i dr.

Medu prvim stvarima na predavanjima iz c++ je bilo da se sto prije rijesimo printfa i scanfa, i to je stvar na kojima bi gubio puno bodova na ispitu i to ne iz nekog hira profesora, vec zato sto je tako ispravno.

Ako krenemo od pretpostavke da je c++ nastao poslije c-a i to na nacin da su zadrzane sve stvari koje su dobre u c-u, a one koje nisu toliko dobre su poboljsanje, pritom direktno mislim i na printf i scanf.
 
Odgovor na temu

zvrba
The Lord of Chaos

Član broj: 31716
Poruke: 105
*.cmu.carnet.hr.



Profil

icon Re: printf() u C++ - svetogrđe?14.01.2005. u 18:01 - pre 233 meseci
Citat:
ivbrcic:
Medu prvim stvarima na predavanjima iz c++ je bilo da se sto prije rijesimo printfa i scanfa, i to je stvar na kojima bi gubio puno bodova na ispitu i to ne iz nekog hira profesora, vec zato sto je tako ispravno.

Nema ispravno i neispravno. Prije ili poslije ces se iz C++-a morat linkat na neki C library u kojem neka funkcija u svom argumentu ocekuje FILE*. Onda hoces-neces moras koristiti C-ov stdio, pa fopen, printf, scanf i ekipu.. a posto je bezveze u istom programu mijesati dvije vrste I/O.. po inerciji ces napravit fallback na Cov stdio :)

Jos jedan razlog zasto mi se C++ streamovi ne svidjaju je to sto ne mozes znati sto je poslo po krivu. Mozes ti rec fstream i("nekifajl.txt"), ali recimo da to ne uspije. I ti nemas pojma zasto (a ima hrpa mogucih razloga - nema memorije, fajl ne postoji, nemas dozvole za pristupiti fajlu, dio patha nije direktorij... itd). U C-u razlog greske mozes procitati u errno globalnoj varijabli (i pokusati nesto drugo napraviti, javiti smislenu gresku korisniku itd..), a u C++-u se mozes slikat.

Citat:
Ako krenemo od pretpostavke da je c++ nastao poslije c-a i to na nacin da su zadrzane sve stvari koje su dobre u c-u, a one koje nisu toliko dobre su poboljsanje, pritom direktno mislim i na printf i scanf.

printf() i scanf() su funkcije koje odlicno sluze svojoj svrsi.

Jedan od razloga zasto se islo u dizajn C++ streamova je to sto se u compile-timeu ne mogu provjeriti da li se argumenti printfa i scanfa slazu sa formatom. Po meni je to bezveze razlog jer i C i C++ neukom programeru ionako nude bezbroj nacina da se upuca u nogu.

Drugi razlog je sto printf i scanf ne mozes prosirivati novim formatima. A ljudi su htjeli zapisivati objekte u fajlove (npr. ne mozes napisati fprintf(f, "%o", pointer_na_moj_objekt), a nekoga je bolilo kad je morao pisati fwrite() za svoje structove, a fprintf() za tekstualne podatke. Pa kad su vec overloadani operatori.. eto neka budu streamovi i << i >> za sve.

Kad sam vec kod ovoga - u C++-u je jako tesko mijesati binarne i tekstualne podatke u jednom fajlu. Jos ide kod pisanja, ali kod citanja...

E sad C++ streamovi su JAKO daleko od onoga sto bi bilo stvarno korisno, a to je serijalizacija objekata koju moras sam pisati i namuciti se ko pas da to napravis ispravno (ili uzet gotov library.. i vidjet kolko je to zapravo komplicirano).

Ukratko, ne vidim opravdanje za postojanje tog dijela C++ libraryja: kompliciraniji je i nudi manje mogucnosti za detekciju runtime gresaka.

Mozda nesto dobijes tek kad ides pisati svoje streambuf klase pa npr. imas on-the-fly kompresiju na streamu (ja napisao tako nesto).. ali imas C libraryja (npr. sfio) u kojima isto to mozes napraviti na puno jednostavniji nacin...

IMHO, C++ streams su jedan veliki promasaj.
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.vdial.verat.net.

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: printf() u C++ - svetogrđe?14.01.2005. u 19:58 - pre 233 meseci
Citat:
ivbrcic: Moj savjet ti je da sto je moguce vise postujes pravila igre, a to znaci ako pises programe u c-u onda koristi printf i dr., a kada pises programe u c++-u onda koristi cout i dr.

Medu prvim stvarima na predavanjima iz c++ je bilo da se sto prije rijesimo printfa i scanfa, i to je stvar na kojima bi gubio puno bodova na ispitu i to ne iz nekog hira profesora, vec zato sto je tako ispravno.

Ako krenemo od pretpostavke da je c++ nastao poslije c-a i to na nacin da su zadrzane sve stvari koje su dobre u c-u, a one koje nisu toliko dobre su poboljsanje, pritom direktno mislim i na printf i scanf.


Pa ajde ovako da kazem, nije sve sto je novije da je odma ujedno i bolje, pre svega printf je bio i ostao majka jer nema tako lakog i elegantnog nacina da formatiramo izlaz uz pomoc ios i njenih nasledjenih klasa, pa onda moras u pomoc da pozivas boost biblioteku i klasu format. Za neke stvari ios moze da posluzi ali kada je u pitanju teska masinerijia, prednost ide printf familiji funkcija.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bos.east.verizon.net.



+6 Profil

icon Re: printf() u C++ - svetogrđe?14.01.2005. u 20:33 - pre 233 meseci
Hehehe, vidi se odmah ko je učio prvo C, pa onda prešao na C++. I ja sam bio u toj situaciji, pa vas razumem, mada je meni printf uvek bio nesimpatičan - podseća me na Fortran.

Nego, kažite vi meni koliko linija koda sa stdio bibliotekom treba da bi se postigla ova prosta stvar:

Code:

string rec;
cin >> rec;


Da ne bude nesporazuma, nije unapred poznato kolika se dužina stringa očekuje.
 
Odgovor na temu

MilanMilan
Côte d'Azur

Član broj: 44664
Poruke: 362
*.83.beocity.net.



+17 Profil

icon Re: printf() u C++ - svetogrđe?14.01.2005. u 23:15 - pre 233 meseci
Ali sta cemo kada nam treba brzina programa, a ne elegantnost koda? :)
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bos.east.verizon.net.



+6 Profil

icon Re: printf() u C++ - svetogrđe?14.01.2005. u 23:58 - pre 233 meseci
Naravno, postoje situacije u kojima je kritično da UI bude maksimalno brz. Lično, u takvim slučajevima direktno koristim OS specifične funkcije, kao što je CreateFile na Windowsu, jer se tako dobija brži kod nego da se koristi C biblioteka.

U primeru koji sam dao, program čeka na korisnika da unese string i razlika u brzini između cin i scanf nema nikakav značaj.

Nego, ozbiljno, hoće li neko da proba da uradi u C-u one dve C++ linije? Ili da odmah dam rešenje?
 
Odgovor na temu

MilanMilan
Côte d'Azur

Član broj: 44664
Poruke: 362
*.83.beocity.net.



+17 Profil

icon Re: printf() u C++ - svetogrđe?15.01.2005. u 00:42 - pre 233 meseci
Pa poznato je da je C brzi, a ti uvek mozes da se spustis na neki nizi nivo, nije u tome poenta ovde.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bos.east.verizon.net.



+6 Profil

icon Re: printf() u C++ - svetogrđe?15.01.2005. u 01:14 - pre 233 meseci
Pa u čemu je poenta po tvom mišljenju? Ja kažem da su iostream biblioteke najčešće bolji izbor od stdio biblioteka jer se kod lakše piše i čitljiviji je a i mogućnosti grešaka su manje. U situacijama kad je neophodno imati maksimalno brz UI, stdio opet nije optimalan izbor, već je često bolje ići direktno na API operativnog sistema.

Sve u svemu, ne koristim printf/scanf 5-6 godina i uopšte mi ne nedostaju. Jedini problem mi je bio da se otarasim stare navike u početku, i upravo to je suština primedbi na streamove koje vidim ovde.
 
Odgovor na temu

blaza
n/a

Član broj: 961
Poruke: 743
*.yu1.net.



+3 Profil

icon Re: printf() u C++ - svetogrđe?15.01.2005. u 04:58 - pre 233 meseci
@Dragi Tata - nije potrebno mnogo linija koda:
Code:
/*pocetak*/
int i = 0, vel = 0;
char* string = NULL, key = 0;
FILE* bafer = tmpfile();
while(key != 0x0d){
    key = getch();
    printf("%c", key);
    fprintf(bafer, "%c", key);
    vel++;}
fflush(bafer);
rewind(bafer);
string = malloc(vel--);
while(!feof(bafer))
    string[i++] = fgetc(bafer);
fclose(bafer);
string[vel] = 0;
/*kraj*/
printf("\nUneti string je >%s<", string);
/* ... */
free(string);

Kada brzina nije presudan faktor privremeni fajlovi se mogu koristiti u date svrhe. U ovom slucaju koristimo privremeni fajl zbog osobine "rastegljivosti". Prikazan kod demonstrira idejno resenje. Resenje primenjivo u praksi iziskuje dodatna poboljsanja.
O_o
 
Odgovor na temu

zvrba
The Lord of Chaos

Član broj: 31716
Poruke: 105
*.cmu.carnet.hr.



Profil

icon Re: printf() u C++ - svetogrđe?15.01.2005. u 08:16 - pre 233 meseci
Citat:
Dragi Tata:
Nego, kažite vi meni koliko linija koda sa stdio bibliotekom treba da bi se postigla ova prosta stvar:


Ajde ti reci koliko je linija koda potrebno sa iostreamovima za sljedece:

Code:

char buf1[14], buf2[65];
int i;

if(sscanf(whatever, "%13[0-9]%d%64[a-zA-Z]", buf1, &i, buf2) != 3) {
  fprintf(stderr, "greska u ulaznom formatu\n");
}


Slozit cu se, kod formatiranog IZLAZA su stdio i iostreams koliko-toliko ravnopravni ako gledas prakticnost koristenja. Za parsiranje ulaza, iostreamovi imaju prednost.

E sad za tvoj konkretan primjer: rijetko kad mi tako sto treba u praksi, a ako mi bas to zatreba skinuo bih i kompajlirao SFIO:

http://www.research.att.com/sw/tools/sfio/

portabilan je, napredniji od stdio (mozes stavljati ulazno/izlazne discipline u layerima i isto tako imati npr. on-the-fly kompresiju i sl.), imas direktan pristup ulaznom bufferu od datoteke, automatski radi mmap() fajla u memoriju ako zna kako na danoj platformi.. i ne bih se vise patio sa stdio nego bih koristio sve mogucnosti SFIO. Eh da, odgovor na tvoje pitanje uz SFIO:
Code:

char *line;

line = sfgetr(f, '\n', SF_STRING);
 
Odgovor na temu

zvrba
The Lord of Chaos

Član broj: 31716
Poruke: 105
*.cmu.carnet.hr.



Profil

icon Re: printf() u C++ - svetogrđe?15.01.2005. u 08:25 - pre 233 meseci
Citat:
blaza
Kada brzina nije presudan faktor privremeni fajlovi se mogu koristiti u date svrhe. U ovom slucaju koristimo privremeni fajl zbog osobine "rastegljivosti". Prikazan kod demonstrira idejno resenje. Resenje primenjivo u praksi iziskuje dodatna poboljsanja.


Svaka cast na rjesenju - zbog ideje temp fajla. fajl koji generira tmpfile() se automatski obrise kad ga zatvoris ili program zavrsi pa je to jako prakticno. Uvijek sam tu stvar rjesavao sa realloc() itd.. ali ovo je puno elegantnije rjesenje.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bos.east.verizon.net.



+6 Profil

icon Re: printf() u C++ - svetogrđe?15.01.2005. u 16:31 - pre 233 meseci
@blaza

Stvarno duhovito rešenje, ali pošteno kaži da li uopšte ima smisla porediti ga sa one dve linije koda koje sam dao? Kolika je mogućnost da napraviš grešku, kolika je čitljivost takvog koda?

@zvrba

Nije ti u praksi potrebno da uneseš string proizvoljne dužine iz nekog toka u memoriju, ali ti je u praksi potrebno da radiš sscanf(whatever, "%13[0-9]%d%64[a-zA-Z]", buf1, &i, buf2) ? Čime se ti baviš u stvari?

Uglavnom, nemam nameru da dozvolim C vs C++ ratove u ovom forumu. Ko želi takvu raspravu neka izvoli na Advocacy.
 
Odgovor na temu

[es] :: C/C++ programiranje :: printf() u C++ - svetogrđe?

[ Pregleda: 3293 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.