Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: c++ binääri tallennus

Sivun loppuun

sooda [27.11.2003 19:30:40]

#

onko c++:ssa vastaavaa jutskaa kun qb:ssä ja vb:ssä Put ja Get?

sqwiik [27.11.2003 19:32:49]

#

Ei ole, mutta voit tehdä ne itse tai käyttää jotain valmista grafiikkakirjastoa.

sooda [27.11.2003 19:33:15]

#

siis binääri tallennukseen, ei siihen grafiikka jutskaan. lue otsikko nääs

sqwiik [27.11.2003 19:43:59]

#

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.

sooda [27.11.2003 19:51:45]

#

Ooke! Kiitos kovasti.

sooda [27.11.2003 20:10:03]

#

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?

sooda [27.11.2003 20:22:32]

#

niin ja sitten onkos tohon jotain seek komentoa? tai append tai jotain... että saisi kursorin sinne tiedoston loppuun?

sqwiik [27.11.2003 21:05:53]

#

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.

sooda [27.11.2003 21:16:59]

#

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?

sooda [27.11.2003 21:18:28]

#

ohhoh... tossa "rw" kuuluis olla "wb" se on vaan kirjotusvirhe... oikee virhe jatkuu...

sooda [27.11.2003 21:27:04]

#

hmm, ja se suorittaa sen virheen mutta tekee tiedoston kuitenkin. Hmm?

sqwiik [28.11.2003 11:52:33]

#

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

sooda [28.11.2003 16:34:23]

#

missä kirjastossa tuo __file__exists on?
niin ja sitten vielä miten stringejä(tai siis char* taulukoita) siis yhdisteltiin?

sqwiik [28.11.2003 17:44:10]

#

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" */
...

sooda [28.11.2003 17:46:58]

#

Oke, kiitos. Nyt toimii mahtavasti.
Ohhoh, ei toimikaan. Ei mulla näyttäis olevan tossa unistd:ssä tota. Ainakin valittaa yhä...

sqwiik [28.11.2003 18:26:47]

#

Mikä kääntäjä? Voin yrittää vetäistä jonkinnäköisen funktion suuresta hatustani, jos sitä ei löydy.

sooda [28.11.2003 18:37:01]

#

dev-c++ 4.01

sqwiik [28.11.2003 18:50:57]

#

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;}
}

sooda [29.11.2003 11:01:35]

#

Testasin, ei toimi :( jos tiedostoa ei löydy, tuo suorittaa virheen kohteessa msvcrt.dll... :(

thefox [29.11.2003 22:41:39]

#

Tuota fclose(f):ää kannattaa luonnollisesti poistaa tuosta else-blokista koska NULL pointterin käsittely ei useimmiten tee mitään hyvää.

sooda [30.11.2003 11:28:34]

#

mutta se ei valita jos nappaan koko jutskan pois, jos jätän ton tiedoston avauksen niin se jumittaa silloinkin...?

thefox [30.11.2003 16:31:48]

#

Pistäppä koko koodi pyhässä kokonaisuudessaan tänne niin saadaan jonkinlainen yleiskuva.

sooda [30.11.2003 18:05:44]

#

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!

sooda [11.12.2003 18:46:52]

#

hmm, nyt aattelin vihdoin katella miten toi seek_end juttu toimii, miten sitä nyt oikeen käytetään? mihin moodiin tiedosto pitää avata?

sqwiik [11.12.2003 19:04:47]

#

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.

sooda [11.12.2003 19:54:36]

#

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... :(

sqwiik [13.12.2003 14:25:24]

#

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.

sooda [13.12.2003 14:26:32]

#

ooke, kiitti... mä oonki vasta aloittelija...

thefox [13.12.2003 15:11:34]

#

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


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta