c - Hvorfor forårsager denne brug af fscanf, at applikationen krasjer?

Indlæg af Hanne Mølgaard Plasc

Problem



Ny til C programmering.


Følgende sektion af kode forsøger at læse en tabs-adskilt liste over MD5 (32 tegn) og den tilsvarende beskrivelse (op til 128 tegn) fra en tekstfil (utf-8), men forårsager, at programmet krasjer:


HANDLE hFile = CreateFileW(good\_path, GENERIC\_READ, FILE\_SHARE\_READ, NULL,
    OPEN\_EXISTING, FILE\_ATTRIBUTE\_NORMAL | FILE\_FLAG\_OVERLAPPED, NULL);
if (hFile == INVALID\_HANDLE\_VALUE)
{
    return FALSE;
}

LPWSTR md5 = malloc(sizeof(wchar\_t) * 32);
LPWSTR desc = malloc(sizeof(wchar\_t) * 128);
int i;
while((i = fwscanf(hFile, L"\%ls \%ls", md5, desc)) != EOF)
{
    if (i == 2) // OK
    {
    }
    else // Something went wrong
    {
    }
}
CloseHandle(hFile);
return TRUE;


Få spørgsmål:



  1. Er min brug af malloc (...) korrekt?

  2. Hvad kan forårsage nedbruddet?



Opdater 1


Jeg har taget denne kode og gjort den til en standalone exe (snarere end en DLL). Fortsætter med at gå i stykker.


Opdater 2


Opdateret til fwscanf som ifølge Chris 'kommentar. Fortsætter nedbrud. Hvis jeg kommenterer linjen while...fwscanf..., udgår den korrekt.

Bedste reference


CreateFileW() returnerer et Windows håndtag, hvilket er ligesom et filnummer men anderledes på en eller anden måde. fwscanf() forventer en FILE* ikke et Windows håndtag; for at få en FILE* åbn din fil med fopen() eller \_wfopen().

Andre referencer 1



  1. \% s gemmer en nullterminator. Malloc 33 og 129 tegn.


Andre referencer 2


\% s gemmer en nullstrenget streng under den adresse, du angiver. For at gemme n signifikante tegn uden bufferoverløb skal du angive en adresse på n + 1 lang buffer.