» »

c++ datoteke

c++ datoteke

hasek ::

rabil bi eno stran kjer so opisani ukazi kako se v c++ dela z datotekami al pa ce kr tu nekdo razlozi

v glavnem rabil bi tako datoteko da imam not shranjenih vec recordov

v knjigi, ki jo imam je opisana samo txt datoteka

OwcA ::

Poglej si dokumentacijo std::iostream in njegove potomce (ifstream ...).
Otroška radovednost - gonilo napredka.

nuclear ::

sj ka nimaš tega v helpu.. spomnem se da je turbo C mew vse v help.. pa vse razloženo...
Corsair 750D - VI Hero - i5 4670k - Corsair Dominator 32GB - 1080Ti - EVO 500GB
- Sabrent 1TB nVME - Corsair AX860i - Ducky Shine 3 Brown

hasek ::

ja kolk vrst datotek pa je v c++



ker jaz sem bil navajen pascala pa so ble tam 3 vrste


tu najdem samo za txt da berem po vrsticah


jaz bi pa mel rad tako da bi lahko v datoteko vpisoval razlicne recorde in jih nato ven bral 1 po enega ne pa da morem it vrstica po vrstici

OwcA ::

Težko govorimo o različnih vrstah datotek, le o različnih načinih zapisovanja podatkov. Ta sta dva, binarni in ASCII.
Otroška radovednost - gonilo napredka.

jlpktnst ::

s tem da naj bi linux poznal samo binarni način, se motim? (to sem pobral v neki man strani, vendar nisem bil preveč pozoren)

OwcA ::

Motiš se.
Otroška radovednost - gonilo napredka.

hasek ::

saj to sem jaz mislo ja samo mene zanima kaki so ukazi za delo z datotekami ke rv knjigi jaz nic pametnega ne najdem nse o datotekam je na 2 straneh pa nic ne pise ena stran je predgovora

Vesoljc ::

Abnormal behavior of abnormal brain makes me normal...

Vesoljc ::

Abnormal behavior of abnormal brain makes me normal...

hasek ::

torej binarni fajli mi omogocajo da lahko zapisujem not po spremenljivkah in ne po vrsticah ane ??

hasek ::

ukazi so pa isti ne ???

OwcA ::

Ukazi so isti, le način zapisovanja moraš nastaviti.
Otroška radovednost - gonilo napredka.

trs ::

@hasek

Ne vem tocno kaj delas, vendar ce pises kaj resnega ... ni prevec pametno zapisat strukturo v file kar tako ...

hasek ::

Napišite program, ki vodi evidenco o N študentih na neki univerzi. Za vsakega študenta so podani naslednji podatki: ime in priimek, številka indeksa, stalno in začasno prebivališče in podatki o opravljenih izpitih. Za vsak izpit so podani naslednji podatki: šifra predmeta, naziv predmeta, profesor, datum opravljanja izpita, ocena pisnega dela, ocena ustnega dela. Program naj za določenega študenta izpiše seznam opravljenih izpitov. Študente naj tudi uredi po abecednem vrstnem redu glede na priimek in ime ali glede na število izpitov, ki jih je študent opravil od določenega datuma naprej.



naloga je tole jaz sem si zamislil tako nardim en struct student

pol pa student [30] nardim array

pol pa ko isce pa to isce in izpisuje pa isce po datoteki direkt to tak dela ker sem nekaj podobnega ze naredo v pascalu lani vendar tukaj ne poznam se tako c++ da bi lahko kr na pamet naredo zato pa sprasujem kak delajo datoteke ne

Ukazi so isti, le način zapisovanja moraš nastaviti.
to mislis tam pri deklaraciji ne binary

OwcA ::

Precej preprosteje (ali vsaj lepše) je, da is izmisliš preprost format zapisa v tekstovno datoteko in uporabiš kar tega. Morda bi XML ne bil slaba ideja, ali pa uporabiš kar kakšno preprosto "flat file" bazo.
Otroška radovednost - gonilo napredka.

trs ::

@hasek

Te podatke imas lahko vse v ASCII datoteki in si ustrezno napises funkcijo ki ti podatke shrani v datoteko in funkcijo, katera ti nalozi podatke v pomnilnik. Pa tu je se ena stvar ... ne vem, ce bo array[30] dovolj za N studentov ;)

hasek ::

to sem samo tak napisal za tu gor


nekaj mi se povej kaj string se deklarira v c++ tak char nekaj[30] al se lahko kako drugace ??


pa potem ko naredim strukturo student
kak naj dam potem to v array

tak ne more bit
int student[30]
kaj naj dam namesto int ?????

OwcA ::

Tebi resno niso jasne osnove. Vrni se najprej k tem.
O dobrih knjigah je bilo tu že dosti govora, malo pobrskaj (po(psevdo)išči).
Otroška radovednost - gonilo napredka.

hasek ::

pa kaj bi ti rad no


v pascalu bi napisal tak x: array[1..30] of student
kak pa v c++

OwcA ::

Rad bi, da so ti jasni podatkovni tipi, zaseganje spomina, delo z datotekami. Osnove skratka.
Ampak, če že hočeš:
struct Student;
...
Student[30] a;

Da ne bo pomote, govorimo o ANSI C++ kjer je struct ekvivalenten class, v Cju je nekoliko drugače.
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

hasek ::

ja saj jaz rabim za c++

snow ::

Prvo pejd si kako poglavje o tipih(int char double...) prebrat, potem lahko kakšno o classih in structih... potem pa lahko dejansko začneš to uporabljat. ne pa obratno...
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

hasek ::

double pa to poznam

BigWhale ::

> Morda bi XML ne bil slaba ideja

Talk about overkill ;>

OwcA ::

@BigWhale: saj me je mikalo predlagati Oracla :).
Otroška radovednost - gonilo napredka.

hasek ::

kaj pa v txt datoteki se da kaj takega naredit:

1. kaki je ukaz da izvem koliko je vrstic v datoteki
2. ali lahko 2 vrstici med sabo zamenjam ?(kako)
3. kako bi lahko vrini l(ali izbrisal) 1 vrstico med drugi dve brez da bi moral celo datoteko na novo pisat
4. kako izvem na kateri poziciji v tatoteki je trenutno program ?
( datotecni kazalec )

Vesoljc ::

1) wajl not enod of fajl do:
- getline;
- ++i;
2&3) IIRC, vrivanja, zamenjave in brisanja lahko storiš, če narediš novo datotetko. druga varjanta pa je, da vso vsebino daš v memmory in tam operiraš z njo, brez omejitev. možno da to zna že ifstream... nisem ziher
4) ifstream::tellg, ifstream::seekg

še nekrat:
klik
Abnormal behavior of abnormal brain makes me normal...

hasek ::

rad bi prilepil del moje kode tu gor pa nikakor ne more ker mi skozi javla neko html napako kako naj to odpravim

Person ::

Najbrž ti teh dveh znakov ne pusti napisat: &lt in >
Poglej source tega html dokumenta...
& pol pa lt; al pa gt; ;)

< >
Let's make something useful!

hasek ::

kaj delam narobe ???



#include iostream.h
#include fstream.h
#include conio.h
#include ctype.h
#include stdlib.h


struct nekaj{
char ime[10];
int datum;
};


nekaj ime;
nekaj x;

main()
{

cout "vpisi ime";
cin ime.ime;
cout "vpisi datum";
cin ime.datum;






fstream mdat ("data.bin", ios::in | ios::out | ios::binary);

mdat.write (ime, sizeof (nekaj));


cout " uspesno zapisano v datoteko";




cout " beri iz datoteke";


getch();

mdat.read (x, sizeof (nekaj));


cout x.ime;
cout x.datum;





}

Vesoljc ::

kaj ti pa javi?

drugače moraš pa verjetno pred branjem, datoteko vsaj flush-at in vrnit kazalec na začetek le-te.
Abnormal behavior of abnormal brain makes me normal...

hasek ::

ze pri compajlanju mi javi napake

--------------------Configuration: dat2 - Win32 Debug--------------------
Compiling...
dat2.cpp
C:\Program Files\Microsoft Visual Studio\MyProjects\dat2\dat2.cpp(33) : error C2664: 'class ostream &__thiscall ostream::write(const char *,int)' : cannot convert parameter 1 from 'struct nekaj' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
C:\Program Files\Microsoft Visual Studio\MyProjects\dat2\dat2.cpp(46) : error C2664: 'class istream &__thiscall istream::read(char *,int)' : cannot convert parameter 1 from 'struct nekaj' to 'char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
C:\Program Files\Microsoft Visual Studio\MyProjects\dat2\dat2.cpp(56) : warning C4508: 'main' : function should return a value; 'void' return type assumed
Error executing cl.exe.

dat2.obj - 2 error(s), 1 warning(s)


kaj drugace za vpis pa izpis je tisto prav al kaj ?

Vesoljc ::

sej ti pravi kaj je narobe:
cannot convert parameter 1 from 'struct nekaj' to 'const char *'

to ti javi takrat, kadar poskušaš podati funkciji neko spremenljivko, ki pa ni takega tipa kot jo funkcija zahteva.
če pogledaš funkcijo fstream.write zgleda deklaracija takole:
write ( const char* str , streamsize n );

prvi parameter je parameter na polje znakov (char, velikost en byte)
drugi pa je v biti int-eger, ki pove koliko znakov iz polja zapišemo...

karkoli zdaj hočeš zapisat moraš najprej narest pretvorbo v točno tak tip, se pravi polje char-ov, katerega naslov potem podaš funkciji write.

ob takih priložnostih se raje zatečem k fread & fwrite
poskusi ;)
Abnormal behavior of abnormal brain makes me normal...

hasek ::

pa bi bil ti tolk dober da bi mi popravo to kar morem naredit ?

Vesoljc ::

Abnormal behavior of abnormal brain makes me normal...

hasek ::

ok uspelo mi je datoteko zapisat sicer sem uporabil fprintf


samo sedaj je problem pri izpisu pa javi napako kaj mam narobe ??


#include iostream.h
#include fstream.h
#include conio.h
#includectype.h
#includestdio.h
#includestdlib.h


struct nekaj{
char ime;
char datum;
};
int y=0;


nekaj ime;
nekaj x;

char t;
main()
{


FILE *file1;




cout "vpisi ime";
cin ime.ime;
cout "vpisi datum";
cin ime.datum;


file1=fopen("hasek.jjj","w");






fprintf(file1,"%c,%c", &ime.ime,&ime.datum);

getch();

cout " uspesno zapisano v datoteko";






fclose(file1);



cout " beri iz datoteke";


getch();

file1=fopen("hasek.jjj","r");

while(file1 =! NULL )
{



fscanf(file1,"%c,%c", ime.ime,ime.datum);
ime.ime=t;

cout endl;




cout ime.ime;
cout ime.datum;
}



fclose(file1);



return 0;
}

Zgodovina sprememb…

  • spremenil: hasek ()

Vesoljc ::

glej, meni se zdi da si ti en velik razvajenc...
pa narobe zapiuješ v datoteko...
%c pomeni single character
uporabi %s za tekst in %d za decimalna števila (int in ostalo)

piše vse, ampak če bi kaj prebral, bi to že vedel...:P
Abnormal behavior of abnormal brain makes me normal...

hasek ::

ja ne pomaga ravno ko pride pri debugeri do izpisa javi da pride fo napake

hasek ::

ok ne vprasaj kako vendar ko sem visual studio na novo zagnal je pa zacelo vredi delat :)))))))



naslednji problem ki ga imam kako sedaj vpisati ce imam strukturo v strukturi osnovna struktura se lepo vpise ko pa hocem dati x.e.k pa se ne vpise in javi napako


#include stdio.h
#include iostream.h
#include stdlib.h
#include conio.h
#include ctype.h
#include string.h

int main ()
{

struct o {
char k[10];
};

struct j
{
char str [80];
float f;
struct o e;
};

j x,u;
FILE * pFile;


cout "vpisi f";
cin x.f;

cout "vpisi str";
cin x.str;

cout "vpisi e";
cin x.e.k;

pFile = fopen ("myfile.txt","w+");
fprintf (pFile, "%f %s %s", x.f, x.str);
fprintf(pFile,"%s", x.e.k);
rewind (pFile);
fscanf (pFile, "%f", &x.f);
fscanf (pFile, "%s", x.str);
fscanf (pFile, "%s", x.e.k);
fclose (pFile);
printf ("e read: %f andI hav %s\n",x.f,x.str);

return 0;
}

BigWhale ::

x.e.k?

Se ti ne zdi, da si rahlo zakompliciral zadeve? ;>
Pa tudi malo cudna imena spremenljivk imas. Kako se sploh znajdes iz te kode? :P

hasek ::

tole kodo ko sem dal gor je tak samo za test da vidim ce bo slo tak no pravis da sem zakompliciral vendar tak more bit ker imam tudi v onem programu ki ga morem napisat vgnezdeno strukturo

Vesoljc ::

zakwa že takoj ne pokažeš tudi error-ja ??? ;(
Abnormal behavior of abnormal brain makes me normal...

hasek ::

ja zato ne ker skompajla vredu samo pol v izvajanju javi

Vesoljc ::

skrajn cajt je da se naučiš debuggat...

od začetne vrstice do končne prtiski F9 (rdeča pika, break point)
nato zaženeš F5 (debug mode), nato po korakih prtiskaš F5.

spodaj desno imaš okence Watch al neki tacga... tja not vpišeš ime spremenljivke ki jo želiš spremljat, ko se spremeni postane rdeča.

in tudi ko pride do napake, boš točno videl KJE je napaka...
nato vprašaj...
Abnormal behavior of abnormal brain makes me normal...

hasek ::

ne bos verjel uspelo mi je vpisati v datoteko in iz nje brati kodo mam takole

#include iostream.h
#include ctype.h
#include conio.h
#include stdlib.h
#include string.h
#include fstream.h
#include stdio.h

struct oj
{
char a[10];
};
struct nekaj{
char ime[10];
char priimek[10];
int datum;
oj e;
};
nekaj x;
nekaj student;

char vrstica[500];
int menu=0;
main()
{




while (menu < 5){
cout endl "vpisi 1 za vpis";
cout endl "vpisi 2 za izpis";
cout endl "pritisni 4 za izbris datoteke";
cout endl "vpisi 5 za izhod";
cin menu;


if (menu == 1 ){


cout "vpisi ime studenta";
cin student.ime;

cout endl "vpisi priimek studenta";
cin student.priimek;

cout endl "vpisi datum";
cin student.datum;

cout "vpisi e";
cin student.e.a;

fstream f("racuni.dat", ios::app);


f.write((char *)&student, sizeof(nekaj));

f.close();

}


if (menu == 2 ){

ifstream f("racuni.dat", ios::in);

system("cls");
while(!f.eof()){
f.read((char *)&x, sizeof(nekaj));


cout x.ime x.priimek x.datum x.e.a endl;
}
f.close();




}



}

if (menu ==4){
}


moj edini problem je se kako bi v programu izbrisal vsebino datoteke

ter kako bi dobil dolzino datoteke kot je v pascalu x= length(hasek.dat)

Vesoljc ::

i said it before, i'll say it again: razvajenc!

1
zakaj pa rabiš dolžino datoteke? sej maš eof...
drgač pa 2 pa poglej predzadnji primer...
če pa uporabljaš cstdio.h (fopen, itd...) 3

a je res tolk težko napisat v yahoo-ja "text file size in c++" ???
dej se mejčken znajdi no...
Abnormal behavior of abnormal brain makes me normal...


Vredno ogleda ...

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

kje zaceti z c++ ?

Oddelek: Programiranje
323416 (1724) Monster
»

velike male besede c++

Oddelek: Programiranje
152008 (1624) PoPon2
»

[C++]Brisanje strukture

Oddelek: Programiranje
71116 (1047) jernejf
»

[C++]Strukture

Oddelek: Programiranje
53479 (3408) jernejf
»

Pac sm butl !!!!!

Oddelek: Programiranje
71136 (778) Phil

Več podobnih tem