onko c++:ssa vastaavaa jutskaa kun qb:ssä ja vb:ssä Put ja Get?
Ei ole, mutta voit tehdä ne itse tai käyttää jotain valmista grafiikkakirjastoa.
siis binääri tallennukseen, ei siihen grafiikka jutskaan. lue otsikko nääs
Ahaa... no nehän löytyvät. fread ja fwrite (FILE-luokan funktioita). fwrite kirjoittaa tiedostoon seuraavasti:
FILE *tiedosto=fopen("koe.txt","wb"); int tilasto[10]; fwrite(&tilasto, sizeof(int), 10, tiedosto);
Jossa: ensimmäinen argumentti on data-alue joka kirjoitetaan tiedostoon, sitten tulee yhden dataelementin osan koko tavuina (sizeof auttaa hitosti), montako elementtiä kirjoitetaan ja lopuksi tiedoston tunniste.
Lukeminen onnistuu samaisesti fread:
FILE *tiedosto=fopen("koe.txt","rb"); //<--br = Read Binary int tilasto[10]; fread(&tilasto, sizeof(int), 10, tiedosto);
Selitys: luetaan 10 kpl int:n kokoista elementtiä ja sijoitetaan tulos data-alueeseen tilasto.
Eiköhän tuo ainakin alkuun auta. Omasta mielestäni helpompi kuin c++:n stream.
Ooke! Kiitos kovasti.
Hmmjoo... tossa on vaan se että jos tiedostoa ei ole niin ohjelma kaatuu:
ALKU caused an invalid page fault in
module KERNEL32.DLL at 0137:bff79f90.
Registers:
EAX=00000020 CS=0137 EIP=bff79f90 EFLGS=00010202
EBX=00540000 SS=013f ESP=0254fd90 EBP=0254fda8
ECX=7803ac28 DS=013f ESI=00000020 FS=aea7
EDX=85d2b850 ES=013f EDI=00000000 GS=0000
Bytes at CS:EIP:
80 3e 04 74 0f 33 c0 50 50 50 68 05 00 00 c0 e8
Stack dump:
85d3c448 7800f439 00000020 78021f2c 00000000 85d3c448 0254fdd8 004013a6 00416008 00000004 00000001 00000000 0254fde4 85d2037f 0254fe18 780045f2
eli miten saa tarkistettua että onko joku tiedosto olemassa?
niin ja sitten onkos tohon jotain seek komentoa? tai append tai jotain... että saisi kursorin sinne tiedoston loppuun?
1. Jos tiedostoa ei ole olemassa, fopen palauttaa NULL.
Eli tarkistat esim. seuraavasti:
..... tiedosto = fopen("koe.txt","rb"); if(tiedosto == NULL){ printf("Tiedostoa ei löydy! Ohjelma lopetetaan!"); exit(1); } .....
2. Funktio on fseek, fseek(tiedosto, offset, metodi).
Metodi SEEK_END vie osoittimen tiedoston loppuun offset:n osoittaman määrän päähän tiedoston lopusta. SEEK_CUR liikuttaa osoitinta suhteessa nykyiseen sijaintiin, ja SEEK_SET vie osoittimen spesifisesti määrättyyn kohtaan tiedostossa.
Hmm, miksei tämä toimi?
FILE *tiedosto=fopen("lok.txt","rb"); if (tiedosto==NULL) { fclose(tiedosto); FILE *luose=fopen("lok.txt","rw"); fclose(luose); } //tässä tehdää tiedostolle jotain... //...
jos nappaan pois ton toisen filen tosta iffin sisältä niin ei tuu erooria muuten msvcrt:ssä käy virhettä... mtäs teen? eikö ton ekan fclosen pitäs auttaa?
ohhoh... tossa "rw" kuuluis olla "wb" se on vaan kirjotusvirhe... oikee virhe jatkuu...
hmm, ja se suorittaa sen virheen mutta tekee tiedoston kuitenkin. Hmm?
Kokeile määrittää sekä tiedosto että luose aliohjelman alussa. Standardi C-kieli ei salli muuttujien tms. määrittelyä ajettavan koodin lomassa, vaan ainoastaan aliohjelman alussa.
Tiedoston olemassaolon voi tarkistaa myös käyttämällä funktiota __file_exists(tiedostonimi), käytän itse sitä.
Kirjoitin koodin suoraan päästä, en ole testannut:
int tarkistaloki(){ FILE *tiedosto; int luotu=0; if(__file_exists("lok.txt")){ tiedosto = fopen("lok.txt","rb"); }else{ /* tiedostoa ei ole */ tiedosto = fopen("lok.txt","wb"); fclose(tiedosto); tiedosto = fopen("lok.txt","rb"); /* on nyt tyhjä */ luotu = 1; } ... käsitellään tiedostoa ... }
missä kirjastossa tuo __file__exists on?
niin ja sitten vielä miten stringejä(tai siis char* taulukoita) siis yhdisteltiin?
Löytyy unistd.h. Jos ei, väsää sellainen vaikka ASM:illa. Ja merkkijonoja käsitellään:
Headeri string.h
strcat liittää merkkijonon toiseen:
strcat(tulos, liitettävä);
char * teksti = "Moi"; ... strcat(teksti, " kaikille"); /* teksti on nyt "Moi kaikille" */ ...
Oke, kiitos. Nyt toimii mahtavasti.
Ohhoh, ei toimikaan. Ei mulla näyttäis olevan tossa unistd:ssä tota. Ainakin valittaa yhä...
Mikä kääntäjä? Voin yrittää vetäistä jonkinnäköisen funktion suuresta hatustani, jos sitä ei löydy.
dev-c++ 4.01
Aaieee... minulle tuntematon... no katsotaas.
*penkoo hattuaan*
Damn... __file_exists on djgpp:n kirjastossa libc.a, tuskin kääntyy devvillä... Tehdääs sitten oma. Tuo SAATTAA toimia, kokeile ensin ja hauku vasta sitten lyttyyn.
int onko_tiedosto(char * fil){ FILE * f=fopen(fil,"r"); /*<-- yritetään avausta pelkkään lukemiseen*/ if(f){fclose(f);return 1;} else{fclose(f);return 0;} }
Testasin, ei toimi :( jos tiedostoa ei löydy, tuo suorittaa virheen kohteessa msvcrt.dll... :(
Tuota fclose(f):ää kannattaa luonnollisesti poistaa tuosta else-blokista koska NULL pointterin käsittely ei useimmiten tee mitään hyvää.
mutta se ei valita jos nappaan koko jutskan pois, jos jätän ton tiedoston avauksen niin se jumittaa silloinkin...?
Pistäppä koko koodi pyhässä kokonaisuudessaan tänne niin saadaan jonkinlainen yleiskuva.
Sain ton sqwiikin jutskan jotenkin toimimaan nyt kuitenkin... en tiiä miten :P väänsin ja säädin ja ihmettelin ja ihmettelin vähän lisää ja yhtäkkiä se ei enää kaatunutkaan :D kiitos!
hmm, nyt aattelin vihdoin katella miten toi seek_end juttu toimii, miten sitä nyt oikeen käytetään? mihin moodiin tiedosto pitää avata?
Mihin hyvänsä moodiin (ainakin minun tietääkseni, en käytä kuin binäärimuotoa). komento fseek(file, SEEK_END, 0) vie lukimen tiedoston viimeiseen bittiin. Vastaavasti fseek(file, SEEK_END, 128) vie lukimen 128 tavun päähän tiedoston lopusta, eli vielä voisi lukea 128 tavua.
jaa, ei toimi mulla.
tiedukka = fopen("alkut.txt","w");
fseek(tiedukka, SEEK_END, 0);
(ja tässä sitte laitetaan sinne jotain)
niin tossa se tekee uuden tiedoston johon se tunkee kaksi välilyöntiä alkuun ja kirjoittaa siihen... :(
Läps läps ympäri korvia...
"w" parametrina luo uuden tiedoston, huolimatta siitä onko tiedostoa olemassa vai ei... Käytä "a":ta (APPEND), se avaa tiedoston jos se on olemassa ja siirtää lukimen automaattisesti loppuun ennen jokaista kirjoitusta, tai luo uuden jos ei ole.
ooke, kiitti... mä oonki vasta aloittelija...
Tähdennetään vielä että em. hommat ovat siis C:lle, C++:ssa on omat metkunsa. C++:n tiedostonkäsittely härveleitä en ole itse koskaan oikein jaksanut sisäistää.
Aihe on jo aika vanha, joten et voi enää vastata siihen.