Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tiedoston luku ei toimi

Sivun loppuun

Meitsi [15.08.2004 19:24:05]

#

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

firebug [15.08.2004 20:06:37]

#

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.

Meitsi [15.08.2004 20:22:47]

#

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?

Metabolix [15.08.2004 21:28:14]

#

Kyllä kannattaa käyttää Windowsin tiedostofunktioita. Englanninkielinen tukisivusto löytyy Tästä (MSDN).

firebug [15.08.2004 21:37:50]

#

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

Meitsi [16.08.2004 21:19:39]

#

Olen jo msdn:nnän jutut lukenut, mutten tajunnut niistä oikein mitään. Kokeilin paria koodia mutta ei toiminu.

Deewiant [16.08.2004 21:24:27]

#

Taitaa olla niin, että fgets() ja fclose() ovat funktioiden ulkopuolella, mitä ei sallita. Ja "filu" näyttäisi olevan deklaroitu kahdesti?

Metabolix [16.08.2004 21:59:58]

#

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

Meitsi [17.08.2004 13:57:32]

#

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.

thefox [18.08.2004 00:00:08]

#

Jos haluat lukea binäärifilua, käytä esim. freadia. Windowsin omia funktioita ei ole montakaan hyvää syytä käyttää kun C:tä koodataan.


Sivun alkuun

Vastaus

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

Tietoa sivustosta