c - Kan ikke skrive filer på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at gemme nogle filer ved hjælp af C, med denne kode:


sprintf(playerinput,"\%s",end);
sprintf(fileloc,"\%s/.notend",getenv("HOME"));
playerdata = fopen(fileloc, "w+"); /*create the new file*/
if (!playerdata)
{
printf("
			Could not save settings file.");    
return;
} else {
fputs(playerinput,playerdata); 
fclose(playerdata); 
}


Det skal sætte playerinput til slutvariablen, som virker på Linux, og derefter sætte filens placering til homearea/.notend, så lav eller rediger filen og sæt den ud. I Linux (gcc) virker det fint. Den samme kode er imidlertid på Windows (i586-mingw32msvc-gcc, fungerer ikke. Gør jeg noget galt, eller er der brug for en anden header-fil? I øjeblikket har jeg:


#define \_CRT\_SECURE\_NO\_WARNINGS
#include <stdio.h>   
#include <string.h>
#include <stdlib.h>
#define MAX\_NOTES 200
#define MAX\_NAMES\_TEXT 200
#define MAX\_NOTES\_TEXT 2000


som mine overskrifter og definerer. Hvis du har brug for flere oplysninger, spørg bare.

Bedste reference


Miljøvariablen HOME er ikke en standardmiljøvariabel på Windows så:


getenv("HOME");


vil returnere NULL. Du skal bruge en anden funktion til at hente en brugers hjemmekatalog på Windows, SHGetFolderPath vil give dette: [15]


char path[MAX\_PATH + 1] = "";

if (SUCCEEDED(SHGetFolderPath(0, 
                              CSIDL\_LOCAL\_APPDATA,
                              0,
                              SHGFP\_TYPE\_CURRENT,
                              path)))
{
    std::cout << path << "
";
}


Denne udgang:



  C: \ Documents and Settings \ admin \ Lokale indstillinger \ Application Data



på min maskine.

Andre referencer 1


Til hvilken placering forsøger du at skrive din fil? Har ansøgningen de rette tilladelser til at skrive til den pågældende placering?


EDIT: Når du kigger på den sti, du lige har defineret C://Documents and Settings//..., skal du prøve den med C:\\Documents and Settings\.... Bemærk at der er dobbelt tilbagekobling for hver skråstreg i stien. Jeg er ikke sikker på, om fopen () ville konvertere / til , så det er værd at prøve.


Hvis du er sikker på at dette ville køre på Windows Vista og derover, kan du få denne vej ved hjælp af getenv("HOMEPATH"). Jeg vil foreslå en makrodefinition som:


#ifdef \_WIN32
#    define HOME\_ENV "HOMEPATH"
#else
#    define HOME\_ENV "HOME"
#endif


efterfulgt af:
getenv(HOME\_ENV) for at få hjemmemappen til brugeren.