Kokeilin tuossa Antin oppaassa mainittua tiedoston avaussysteemiä. Includetin stdio.h:n mutta ei silti toimi.
Tässä avauskoodi:
char rivi[500]; FILE *filu; filu = fopen("tapahtumat.pack", "r"); fgets(rivi, 500, filu); fclose(filu);
EDIT: Virheet:
ISO C++ forbids declaration of `filu' with no type
conflicting types for `int filu'
previous declaration as `FILE*filu'
ISO C++ forbids declaration of `fgets' with no type
`int fgets' redeclared as different kind of symbol
previous declaration of `char* fgets(char*, int, FILE*)'
initializer list being treated as compound expression
ISO C++ forbids declaration of `fclose' with no type
`int fclose' redeclared as different kind of symbol
previous declaration of `int fclose(FILE*)'
[Build Error] [koodi.o] Error 1
Mitäs kääntäjää käytät ja mille alustalle koodailet? Pasteta koko koodisi niin voisin kokeilla kääntää sitä.
Heitetäänpäs tähän vielä villi arvaus: Onhan kaikki koodi mainin sisällä? Näyttäisi siltä, että määrittelet funktioita uudestaan. Jos näin ei ole, siirrä koodi mainin sisään.
Siis toi on windows ohjelmassa. Ja koodia on kolme ja puolisataa riviä niin en viitsisi ruveta pasteamanaan. Käytän dev-c++:ssaa.
EDIT: Vai pitäiskö mun käyttää windows-apin omia tiedostosysteemejä? Miten niitä käytetään?
Kyllä kannattaa käyttää Windowsin tiedostofunktioita. Englanninkielinen tukisivusto löytyy Tästä (MSDN).
Kerta kyse on Windows ohjelmasta, suosittelisin käyttämään Winapin omia tiedostofunkkareita. Itse en ole koskaan niitä käyttänyt, mutta MSDN:stä luulisi noihin ohjeet löytyvän.
Edit: Kannattaisi varmaan päivittää sivu ennen kuin vastaa ;)
Olen jo msdn:nnän jutut lukenut, mutten tajunnut niistä oikein mitään. Kokeilin paria koodia mutta ei toiminu.
Taitaa olla niin, että fgets() ja fclose() ovat funktioiden ulkopuolella, mitä ei sallita. Ja "filu" näyttäisi olevan deklaroitu kahdesti?
Deewiant: filu on määritelty vain kerran: "FILE *filu" Toisella kertaa sille yritetään antaa arvo. Siinä olet kyllä oikeassa, että nuo vaikuttaisivat olevan funktioiden ulkopuolella. Tuo virhe uudelleenmäärittämisestä johtuu varmaankin siitä, että käytettävä kääntäjä olettaa jälkimmäisenkin olevan määrittely, koska se on funktioiden ulkopuolella, ja olettaa tyypiksi "int" kun sitä ei ole ilmoitettu.
Ja tässä esimerkki tiedoston lukemisesta WinAPI:lla. Huomaa, että tekstimuotoisia lukuja ei saada ohjelmaan lukuina, vaan lukeminen tapahtuu binäärimuodossa. Tiedostosta siis luetaan kokonaislukuun neljä tavua.
bool Esim() { HANDLE hFile; hFile = CreateFile("Tiedostonimi.txt", GENERIC_READ, // Haluamme lukea tiedostosta. FILE_SHARE_READ, // Annetaan muiden lukea samaan aikaan. NULL, OPEN_EXISTING, // Avataan aiempi; jos tiedostoa ei ole, funktio epäonnistuu. FILE_ATTRIBUTE_NORMAL, NULL); DWORD dwBytesReadA, dwBytesReadB; int KohdeA, KohdeB; // Luetaan KohdeA:han ja KohdeB:hen sen koon verran, siis 4 tavua ReadFile(hInput, &KohdeA, sizeof(int), &dwBytesReadA, NULL); ReadFile(hInput, &KohdeB, sizeof(int), &dwBytesReadB, NULL); // Suljetaan tiedosto. CloseHandle(hFile); dwBytesReadA += dwBytesReadB; // Jos dwBytesReadA on eri kuin tavumäärä joka piti lukea, jokin on mennyt pieleen. if (dwBytesReadA != 2 * sizeof(int)) { return false; } return true; }
Metabolix --> kiitti hyvästä esimerkistä, mutta eikö windowssi todellakaan anna lukea tiedostoa kokonaan? Joudunko siis tekemään loopin joka lataa aina nuo neljä bittiä kerrallaan ja ymppää ne char-muuttujaan?
Deewiant --> Nuo eivät olleet funktion sisällä(kuten sanoit) joten asia varmaan korjaantuu sillä, että laitan ne sinne. Kokeillaan...
EDIT: Ja onko korrektia käyttää tiedoston luvussa noita fgets:iä tms. kun ohjelma kuitenkin on windows-ohjelma. Tuleeko yhteensopivuusongelmia tms?
TUPLA EDIT: Sain tuon tiedoston lukemisen toimimaan tuolla ei-windows systeemillä. Käytän nyt alkuun ainakin sitä koska se on helpompi. Se funktioon laittaminen auttoi.
Jos haluat lukea binäärifilua, käytä esim. freadia. Windowsin omia funktioita ei ole montakaan hyvää syytä käyttää kun C:tä koodataan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.