2012-03-14 58 views
2

我试图挽救用C一些文件,与此代码文件:无法写在Windows

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

应该设置playerinput到底变量,它在Linux下正常工作,然后将文件位置homearea/.notend,然后制作或编辑该文件,然后放出。在Linux(gcc)中,这工作正常。 ?同样的代码,但是,在Windows(i586的-mingw32msvc-GCC,不工作我做得不对,或者是需要另一个头文件,目前我有:

#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 

我的头,并定义如果。你需要更多的信息,只问

回答

0

环境变量HOME不是Windows所以默认环境变量:

getenv("HOME"); 

将返回NULL。您需要使用不同的功能,以获得在Windows用户的主目录,SHGetFolderPath将提供此:

char path[MAX_PATH + 1] = ""; 

if (SUCCEEDED(SHGetFolderPath(0, 
           CSIDL_LOCAL_APPDATA, 
           0, 
           SHGFP_TYPE_CURRENT, 
           path))) 
{ 
    std::cout << path << "\n"; 
} 

此输出:

C:\ Documents和Settings \管理\本地设置\应用数据

在我的机器上。

+0

啊,这可能是问题所在。它从什么都没有,所以试图保存.notend在没有目录。我应该用什么来代替HOME? – user1150512 2012-03-14 16:45:50

+0

我发现了关于“USERPROFILE”,现在它工作。谢谢! – user1150512 2012-03-14 16:53:43

+1

@ user1150512:如果这解决了您的问题,请确定接受此答案。 – 2012-03-14 17:11:20

1

要你试图写你的文件,该文件的位置应用程序是否有正确的权限写入到该位置

编辑:??纵观路径样式刚刚定义C://Documents and Settings//...,你应该用C:\\\\Documents and Settings\\...来试一下,注意p中每个斜杠都有双反斜杠ATH。我不确定fopen()是否会将/转换为\,所以值得一试。

如果您确定这将在Windows Vista及更高版本上运行,您可以使用getenv("HOMEPATH")获取此路径。我建议在宏定义,如:

#ifdef _WIN32 
# define HOME_ENV "HOMEPATH" 
#else 
# define HOME_ENV "HOME" 
#endif 

其次: getenv(HOME_ENV)获得用户的主目录。

+0

我试图将文件保存到用户主目录(我认为在Windows上这将是C:// Documents and Settings/user)。由于同一用户正在运行该程序作为文件目录,我相信这些权限是正确的。 – user1150512 2012-03-14 16:42:12

+0

如果他正在创建一个“点文件”,那么保存它的习惯地方应该放在APPDATA(或者更好的说是它下面的一个目录)中。而且,您必须将HOMEDRIVE(或HOMESHARE)连接到HOMEPATH才能获得完整的路径,如果它不在C驱动器上,您的解决方案将会中断 - USERPROFILE是整个目录名称的适当变量。 – Random832 2012-03-14 16:55:19