Ok penso di aver capito
stavo facendo la prima funzione apri_file
ma il linker mi da questo errore
1>------ Inizio compilazione: Progetto: esperimento file, Configurazione: Debug Win32 ------
1>Compilazione in corso...
1>esperimento file.cpp
1>Collegamento in corso...
1>esperimento file.obj : error LNK2019: riferimento al simbolo esterno "void * __cdecl apri_file(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >,int,int)" (?apri_file@@YAPAXV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@HH@Z) non risolto nella funzione _wmain
1>H:\compilatore mio\esperimenti\esperimento file\Debug\esperimento file.exe : fatal error LNK1120: 1 esterni non risolti
1>Il log di compilazione è stato salvato in 'file://h:\compilatore mio\esperimenti\esperimento file\esperimento file\Debug\BuildLog.htm'
1>esperimento file - 2 errore/i, 0 avviso/i========== Compilazione: 0 completate, 1 non riuscite, 0 aggiornate, 0 ignorate ==========
credo di aver capito che la definizione con HANDLE della funzione non sia corretta.
se cosi fosse come faccio ad ottenere l'handle del file?
il codice e il seguente:
#include "stdafx.h"
#include "windows.h"
#include <iostream>
//#include "strsafe.h"
#include <string>
using std::cout;
using std::cin;
using namespace std;
HANDLE apri_file(wstring,int,int);
int _tmain(int argc, _TCHAR* argv[])
{
SetLastError(0);
cout << "esperimento di apertura, lettura, scrittura di un file utilizzando gli handle\n";
cout << "il nome del file per il momento è costante.\n";
cout << "fase 1 APERTURA FILE esito : ";
HANDLE hesp;
DWORD letti; //, scritti, posizione;
DWORD errore;
wstring nomefile = L"a:\\esempio.txt";
int open_mode,err;
char buff[80] = {0};
int ok = 0;
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 << "positivo\n";
cout << "fase 2 LETTURA FILEB esito;";
do
{
ReadFile(hesp, buff, 80, &letti, NULL);
if (hesp == INVALID_HANDLE_VALUE)
{
cout << "errore ";
errore = GetLastError();
switch (errore)
{
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 22;
}
if (ok == 0)
{ cout << "ok\n";
ok++;
}
buff[letti-1]=0;
cout << buff;// << '\n';
memset(buff,0,80);
}
while ( letti == 80);
cout << "\nfile finito\n";
CloseHandle(hesp);
return 0;
//}
HANDLE apri_file( wstring nomefile,int open_mode,int err);
{
DWORD errore;
switch (open_mode)
{
case 1:
{
CreateFile( nomefile.c_str(), // apre esempio.TXT
GENERIC_READ, // apre per lettura
0, // non condividere
NULL, // no security
OPEN_EXISTING, // solo file esistenti
FILE_ATTRIBUTE_NORMAL, // file normale
NULL); // no attr.
break;
}
case 2:
{
CreateFile( nomefile.c_str(), // apre esempio.TXT
GENERIC_WRITE, // apre per lettura
0, // non condividere
NULL, // no security
OPEN_EXISTING, // solo file esistenti
FILE_ATTRIBUTE_NORMAL, // file normale
NULL); // no attr.
break;
}
case 3:
{
CreateFile( nomefile.c_str(), // apre esempio.TXT
GENERIC_READ | GENERIC_WRITE, // apre per lettura
0, // non condividere
NULL, // no security
OPEN_EXISTING, // solo file esistenti
FILE_ATTRIBUTE_NORMAL, // file normale
NULL); // no attr.
break;
}
default:
{
err=-1;
break;
}
}
if (err == -1) { return 0; }
if (hesp == INVALID_HANDLE_VALUE)
{
err=-2;
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 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 * (-1);
return 0;
}
}
}