PDA

View Full Version : [C] Gestione file


Alhazred
11-06-2005, 09:43
Devo gestire un flusso i/o su un file, il codice che per ora ho scritto è questo:

#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <conio.h>

#define Errore_(x) {puts(x);getch();ExitProcess(1);}

int main(int argc, char *argv[]) {
HANDLE bookf; //handle al file contenente le informazioni

bookf = CreateFile("pippo.txt",
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(bookf == INVALID_HANDLE_VALUE){
bookf = CreateFile("pippo.txt",
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(bookf == INVALID_HANDLE_VALUE)
Errore_("Impossibile accedere al file pippo!\
\n\nPremere un tasto per terminare...");
}
}

Con questo codice riesco ad aprire il file.

Come uso l'api

BOOL ReadFile(
HANDLE hFile, // handle of file to read
LPVOID lpBuffer, // pointer to buffer that receives data
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // pointer to number of bytes read
LPOVERLAPPED lpOverlapped // pointer to structure for data
);

per leggere un carattere alla volta dal file in questione e madarlo in output su video sempre un carattere alla volta?
Il file conterrà una cosa del genere:
a4c5e3f8g0b3h6...
quindi la sequenza di operazioni dovrebbe essere:
- leggi il primo carattere (sarà una lettera), mettilo in una variabile e stampalo a video (andrà bene anche printf() per questo)
- leggi il secondo carattere (sarà un numero), mettilo in una variabile e stampalo a video
- leggi il terzo carattere (di nuovo una lettera), mettilo in una variabile (la stessa della prima) e stampalo a video...
- e così via fino alla fine del file.

Inoltre non capisco una cosa, non dovrei poter usare "CREATE_NEW|OPEN_EXISTING" con un unica chiamata a CreateFile(), invece di usare 2 volte CreateFile() una volta col primo e una volta col secondo in caso di fallimento? Ho provato, ma non funziona :confused:

alderighi
11-06-2005, 11:10
ma perchè invece di usare la windows.h con la CreateFile non usi la iostream.h con i relativi buffer di lettura e scrittura?

Alhazred
11-06-2005, 11:59
Perché sto risolvendo un esercizio e devo usare le API di Windows.

DanieleC88
11-06-2005, 14:59
Be', non sono molto esperto delle API di Windows, ma ci provo:
char * putnatore;

while (ReadFile(bookf, puntatore, 1, NULL, NULL))
{
printf("%s", puntatore);
};

Alhazred
11-06-2005, 15:21
Ho appena risolto così:

char buf;
DWORD size;

while(size>0) //legge il file finché non finisce
{
if(ReadFile(bookf,&buf,1,&size,NULL)==0)
Errore_("Impossibile leggere dal file pippo!\
\n\nPremere un tasto per terminare...");
if(size>0)
printf("%c",buf);
}

Grazie ugualmente per l'interessamento :)