我是C ++中的菜鸟但想要学习。我有一个小程序,可以将一些信息写入Windows中的\etc\hosts
;我通过%WINDIR%
得到GetEnvironmentVariable()
变量,如果我手动输入完整路径一切正常,但当我用WINDIR
变量替换时,我的代码没有编译。我知道我做的不对。
#include <windows.h>
#include <ios>
#include <fstream>
char buffer[1000];
int main() {
GetEnvironmentVariable("WINDIR",(char*)&buffer,sizeof(buffer));
std::ofstream log;
log.open("%s\\system32\\drivers\\etc\\hosts", buffer);
log << "127.0.0.1 domain.com\n" << std::endl;
return 0;
}
我得到了非常难看的错误,如:
C:\ Documents and Settings \ xtmtrx \ Desktop \ coding \ windir.cpp没有匹配函数来调用“
std::basic_ofstream<char, std::char_traits<char> >::open(const char[30], char[1000])
”
答案 0 :(得分:2)
ofstream
无法为您格式化路径。您需要单独执行此操作,例如:
#include <windows.h>
#include <ios>
#include <fstream>
char buffer[1000] = {0};
int main() {
GetEnvironmentVariable("WINDIR",buffer,sizeof(buffer));
strcat(buffer, "\\system32\\drivers\\etc\\hosts");
std::ofstream log;
log.open(buffer, ios_base::ate);
log << "127.0.0.1 domain.com\n" << std::endl;
return 0;
}
仅供参考,您应该使用GetWindowsDirectory()
,GetSystemDirectory()
,SHGetSpecialFolderPath()
或SHGetKnownFolderPath()
代替GetEnvironmentVariable()
。并且在将路径连接在一起时应该使用PathCombine()
,这样可以确保斜杠是正确的。
答案 1 :(得分:1)
您需要将字符串连接在一起,如下所示:
LPTSTR windir[MAX_PATH];
LPTSTR fullpath[MAX_PATH];
GetWindowsDirectory(windir, MAX_PATH);
if(PathCombine(fullpath, windir, _T("system32\\drivers\\etc\\hosts")) != NULL) {
std::ofstream log;
log.open(buffer, ios_base::ate);
log << "127.0.0.1 domain.com\n" << std::endl;
}
首先,您需要使用PathCombine连接目录和文件部分。然后,您可以打开文件并编写内容。您还应注意,您需要管理员权限才能更改此文件,某些防病毒程序可能会拒绝访问hosts文件。
答案 2 :(得分:1)
open("%s\\system32\\drivers\\etc\\hosts", buffer);
open不理解格式字符串..您正在使用%s
没有意义。学习here
试试这样:
GetEnvironmentVariable("WINDIR",buffer,sizeof(buffer));
strcat(buffer, "\\system32\\drivers\\etc\\hosts");
std::ofstream log;
log.open(buffer.str().c_str(), ios_base::ate);