Guarda un pò se ho fatto le procedure bene specialmente quella di posizione del puntatore del file.
// esperimento file2.cpp : definisce il punto di ingresso dell'applicazione console.
//
#include "stdafx.h"
#include "windows.h"
#include <iostream>
#include <string>
using std::cout;
using std::cin;
using namespace std;
HANDLE apri_file(wstring,int,int);
int leggi_file(handle,const char*,int);
int posiziona_record(HANDLE,int,int);
int _tmain(int argc, _TCHAR* argv[])
{
SetLastError(0);
HANDLE hesp;
DWORD letti;
DWORD errore;
wstring nomefile;
int open_mode,err,i;
int lrecord=80;
char buff[80] = {0};
cout << "esperimento di lettura di un file\n";
cout << "dopo l'apertura saranno stampati i record pari\n";
cout << "inserisci il nome del file : ";
cin >> nomefile;
cout << "\n";
open_mode=1;
err=0;
hesp = apri_file (nomefile,open_mode,0);
if (err == -1)
{
cout << "errore di parametri nella apertura del file\n";
return 0;
}
cout >> "apertura ok\n";
i=1;
while ( err == 0 )
{
err=posiziona_record(hesp,i,80);
if (err == 1)
{
cout >> " errore posizionamento passata la fine del file\n";
goto uscita_emergenza;
}
err=leggi_file(hesp,buff,80);
if (err == 1)
{
cout >> "errore in lettura file\n";
goto uscita_emergenza;
}
i=i+2;
uscita_emergenza:
}
cout >> "lettura finita\n";
CloseFile(hesp);
}
HANDLE apri_file( wstring nomefile,int open_mode,int err)
{
DWORD errore,open_flag;
HANDLE hesp;
switch (open_mode)
{
case 1: {
open_flag = GENERIC_READ;
break;
}
case 2: {
open_flag = GENERIC_WRITE;
break;
}
case 3: {
open_flag = GENERIC_READ | GENERIC_WRITE;
break;
}
default: {
err=1;
break;
}
}
if (err == 1) { return INVALID_HANDLE_VALUE; }
hesp = CreateFile (nomefile.c_str(),
open_flag,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hesp == INVALID_HANDLE_VALUE)
{
cout << "errore ";
errore = GetLastError();
switch (errore) // al posto del messaggio di errore in fase definitiva mettere un codice nella variabile err.
{
case 2: { cout << "file non trovato\n"; break; }
case 3: { cout << "path non trovato\n"; break; }
case 6: { cout << "handle non corretto\n"; break; }
case 21: { cout << "inserisci il disco e rilancia il programma\n"; break; }
case 26: { cout << "disco non dos o non formattato\n"; break; }
case 30: { cout << "lettura\n"; break; }
case 31: { cout << "disco non funzionante\n"; break; }
case 108: { cout << "disco in uso da un altro processo\n"; break; }
case 110: { cout << "apertura\n"; break; }
case 1123: { cout << "interno al disco\n"; break; }
case 1124: { cout << "interno al disco\n"; break; }
case 1125: { cout << "interno al disco\n"; break; }
case 1392: { cout << "file danneggiato\n"; break; }
case 1393: { cout << "disco danneggiato\n"; break; }
default: {
cout << "sconosciuto\n";
cout << "codice di errore rilevato = " << errore << "\n";
break;
}
}
err=errore;
hesp = INVALID_HANDLE_VALUE;
return hesp;
}
return hesp;
}
int leggi_file(hesp,buff,int record)
{
ReadFile(hesp, buff, 80, &letti, NULL);
if (hesp == INVALID_HANDLE_VALUE)
{
cout << "errore ";
errore = GetLastError();
switch (errore)
{
case 6: { cout << "handle non corretto\n"; break; }
case 30: { cout << "lettura\n"; break; }
case 31: { cout << "disco non funzionante\n"; break; }
case 108: { cout << "disco in uso da un altro processo\n"; break; }
case 1123: { cout << "interno al disco\n"; break; }
case 1124: { cout << "interno al disco\n"; break; }
case 1125: { cout << "interno al disco\n"; break; }
case 1392: { cout << "file danneggiato\n"; break; }
case 1393: { cout << "disco danneggiato\n"; break; }
default:
{
cout << "sconosciuto in fase di lettura\n";
cout << "codice di errore rilevato = " << errore << "\n";
break;
}
}
return 1;
}
return 0;
}
// sotto c'è la procedura di posizionamento nel file ho considerato il record di 80 caratteri
int posiziona_record(hesp,i,lrecod);
{
LARGE_INTEGER in;
in.QuadPart = i * lrecord;
LARGE_INTEGER out;
out.QuadPart = 0;
DWORD ERRORE;
SetFilePointerEX(hesp,in,&out,FILE_BEGIN);
if (::SetFilePointerEx(hesp,in,&out,FILE_BEGIN) == 0)
{
ERRORE = GetLastError()
cout << "N. errore = " << errore; // devo ancora scoprire quali codici mi servono per fare
//una gestione errori ben fatta
cout << "\n";
return 1
}
return 0;
}
speriamo che per gravita e numero di errori sono migliorato!
le routine le devo ancora eseguire