/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
To spørgsmål
Fra : David


Dato : 27-04-01 21:30

Hej lige to spørgsmål jeg brænder inde med.
1. Jeg skal foretage en simpel io opereation i visual c hvor jeg bare skal
læse fra en fil og vise det i en meddelsesboks. Hvorfor virker dette ikke?
HANDLE hf;

hf=CreateFile("loi.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NOR
MAL,NULL);
UINT ui=150;
ReadFile(hf,&buffer,strlen(buffer),&ui,NULL)
MessageBox(hWnd, buffer, "Info", MB_OK);
2. Hvordan finder jeg ud af om en streng(af typen PSTR) er tom. Jeg skal
bruge det til at finde ud af om programmet bliver åbnet uden parametre.
Hilsen David.



 
 
Søren Bro Thygesen (29-04-2001)
Kommentar
Fra : Søren Bro Thygesen


Dato : 29-04-01 14:37



David wrote:

> Hej lige to spørgsmål jeg brænder inde med.
> 1. Jeg skal foretage en simpel io opereation i visual c hvor jeg bare skal
> læse fra en fil og vise det i en meddelsesboks. Hvorfor virker dette ikke?
> HANDLE hf;
>
> hf=CreateFile("loi.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NOR
> MAL,NULL);
> UINT ui=150;
> ReadFile(hf,&buffer,strlen(buffer),&ui,NULL)
> MessageBox(hWnd, buffer, "Info", MB_OK);
> 2. Hvordan finder jeg ud af om en streng(af typen PSTR) er tom. Jeg skal
> bruge det til at finde ud af om programmet bliver åbnet uden parametre.
> Hilsen David.

1.)

Du viser ikke hvordan buffer er deklareret men du læser strlen(buffer) bytes ind
i buffer. Det ville give pragtfuld mening hvis du kaldte WriteFile. Man må da gå
ud fra at buffer enten er tom eller at begyndelses-længden for buffer ingenting
har at gøre med hvor meget du vil læse fra filen... Prøv at skrive
strlen(buffer) ud til konsollen el.lign. Ydermere, hvis du kigger i online help
vil du se at ReadFile's 4. parameter er en output parameter, ikke en input
parameter. Så at sætte ui = 150 giver ikke mening, jvf. MSDN:

lpNumberOfBytesRead
[out] Pointer to the number of bytes read. ReadFile sets this value to zero
before doing any work or error checking.


------------------------------------------------------------------------------------------------------------------------------------------------

#include <windows.h>

int main() {

HANDLE h;
DWORD dwBytesRead, dwFileSizeLow;

h=::CreateFile(
TEXT("D:\\TEST.TXT"),
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);

if(h == INVALID_HANDLE_VALUE)
{
::MessageBox(NULL, TEXT("Error opening file."), TEXT("Error"), MB_OK |
MB_ICONSTOP);
return 1;
}


// GetFileSize is a bit tricky, see the online help. This will only work if the
file is not huge.
dwFileSizeLow = GetFileSize(h, NULL);
if(dwFileSizeLow == 0xFFFFFFFF)
{
::MessageBox(NULL, TEXT("Couldn't get file size."), TEXT("Error"), MB_OK |
MB_ICONSTOP);
::CloseHandle(h);
return 1;
}


LPSTR lpsz = new TCHAR[dwFileSizeLow + 1];
if(!lpsz)
{
::MessageBox(NULL, TEXT("Out of memory."), TEXT("Error"), MB_OK |
MB_ICONSTOP);
::CloseHandle(h);
return 1;
}

:: memset(lpsz, 0, sizeof(TCHAR) * (dwFileSizeLow + 1));

if(!::ReadFile(h, lpsz, dwFileSizeLow, &dwBytesRead, NULL) || dwBytesRead !=
dwFileSizeLow)
{
::MessageBox(NULL, TEXT("Error reading file."), TEXT("Error"), MB_OK |
MB_ICONSTOP);
delete [] lpsz;
::CloseHandle(h);
return 1;
}

::CloseHandle(h);

::MessageBox(NULL, lpsz, TEXT("DATA"), MB_OK);

delete [] lpsz;

return 0;
}

------------------------------------------------------------------------------------------------------------------------------------------------



2.)

I winnt.h er PSTR typedef'ed som

typedef CHAR *LPSTR, *PSTR;

Så du kan bare:

PSTR pstr = NULL;

// manipulate pstr

if( ! (pstr && lstrlen(pstr) > 0))
{
// pstr is empty
}


mvh,
S. Bro



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste