WritePrivateProfileString 在 main 中有效但在函数中无效
WritePrivateProfileString works in main but not in function
我正在尝试将 WritePrivateProfileString 和 GetPrivateProfileInt 用于 .ini
解析器。
当我将下面的代码放入 main()
或 class 构造函数中时,它可以用于写入和读取。
但是,当我创建用于写入和读取的函数,并调用 main()
中的函数时,没有任何反应,尽管这些函数是 运行 因为它们会 cout
如果我要求他们。
这是我编写的测试程序来证明这一点:
#include <iostream>
#include <Windows.h>
#include <fstream>
#include <string>
#define CStringify(x) std::to_string(x).c_str()
int testvar = 12;
int returntestvar = 0;
std::fstream config;
std::string configstring = ".//config.ini";
int main()
{
WriteINI();
ReadINI();
std::cout << returntestvar << std::endl;
getchar();
}
void WriteINI()
{
config.open("config.ini", std::ios::app);
WritePrivateProfileString("Test", "Test1", CStringify(testvar), configstring.c_str());
}
void ReadINI()
{
config.open("config.ini", std::ios::app);
returntestvar = GetPrivateProfileInt("Test", "Test1", 0, configstring.c_str());
}
以上代码创建并编辑了一个 .ini
文件,正如预期的那样。
但是,如果我将代码移到 class 中,它将不再有效。
main.cpp
#include <iostream>
#include <Windows.h>
#include <fstream>
#include <string>
#include "INIClassTest.h"
extern INIParser* Parse;
int main()
{
Parse->WriteINI();
Parse->ReadINI();
std::cout << Parse->returntestvar << std::endl;
getchar();
}
INIClassTest.h
#pragma once
#include <fstream>
#include <string>
#include <Windows.h>
#define CStringify(x) std::to_string(x).c_str()
class INIParser
{
public:
INIParser();
void WriteINI();
void ReadINI();
int testvar;
int returntestvar;
std::fstream config;
std::string configstring;
};
extern INIParser* Parse;
INIClassTest.cpp
#include "INIClassTest.h"
#include <iostream>
INIParser* Parse = new INIParser();
INIParser::INIParser()
{
returntestvar = 0;
testvar = 18;
std::string configstring = ".//config.ini";
}
void INIParser::WriteINI()
{
config.open("config.ini", std::ios::app);
WritePrivateProfileString("Test", "Test1", CStringify(testvar), configstring.c_str());
}
void INIParser::ReadINI()
{
config.open("config.ini", std::ios::app);
returntestvar = GetPrivateProfileInt("Test", "Test1", 0, configstring.c_str());
}
上面的代码创建了一个 .ini
文件,但它没有编辑它或 return 任何东西。
您根本不应该使用 fstream
手动 create/open INI 文件。 WritePrivateProfileString()
和 GetPrivateProfileInt()
为您处理。
此外,如果您阅读他们的文档,您会发现不应该使用 INI 文件的相对路径,否则该文件将相对于 Windows 安装文件夹,而不是您的应用程序文件夹.因此,您可能是 reading/writing INI 文件,而不是您期望的 from/to。如果您希望您的 INI 文件相对于您的应用程序文件夹,您需要检索您的应用程序文件夹的路径 1 并将 INI 文件名附加到它。
1:但总的来说,这确实不是一个好主意。根据您安装应用程序的位置,用户可能没有对该文件夹的写入权限。您应该改为使用 SHGetFolderPath()
或 SHGetKnownFolderPath()
来获取用户的本地 %AppData%
文件夹,然后在其中创建您自己的子文件夹,然后在该子文件夹中创建您的 INI 文件。
试试这个:
#include <Windows.h>
#include <iostream>
#include <string>
#define CStringify(x) std::to_string(x).c_str()
std::string GetAppFolder();
std::string GetINIPath();
void WriteINI();
void ReadINI();
int testvar = 12;
int returntestvar = 0;
std::string configstring = GetINIPath();
int main()
{
WriteINI();
ReadINI();
std::cout << returntestvar << std::endl;
std::cin.get();
return 0;
}
std::string GetAppFolder()
{
char szFileName[MAX_PATH];
DWORD len = GetModuleFileName(NULL, szFileName, MAX_PATH);
std::string result(szFileName, len);
std::string::size_type pos = result.find_last_of("\/");
result.resize(pos+1);
return result;
}
std::string GetINIPath()
{
return GetAppFolder() + "config.ini";
}
void WriteINI()
{
WritePrivateProfileString("Test", "Test1", CStringify(testvar), configstring.c_str());
}
void ReadINI()
{
returntestvar = GetPrivateProfileInt("Test", "Test1", 0, configstring.c_str());
}
您的 INIParser
class 失败的主要原因是您的构造函数将 INI 文件路径存储在名为 configstring
的局部变量中,而不是 class的成员也叫 configstring
。因此,当调用 WriteINI()
和 ReadINI()
时,class 成员为空。
试试这个:
main.cpp
#include <iostream>
#include "INIClassTest.h"
int main()
{
Parse.WriteINI();
Parse.ReadINI();
std::cout << Parse.returntestvar << std::endl;
std::cin.get();
return 0;
}
INIClassTest.h
#pragma once
#include <string>
class INIParser
{
public:
INIParser();
void WriteINI();
void ReadINI();
int testvar;
int returntestvar;
std::string configstring;
};
extern INIParser Parse;
INIClassTest.cpp
#include <Windows.h>
#include "INIClassTest.h"
#include <string>
#define CStringify(x) std::to_string(x).c_str()
INIParser Parse;
static std::string GetAppFolder()
{
char szFileName[MAX_PATH];
DWORD len = GetModuleFileName(NULL, szFileName, MAX_PATH);
std::string result(szFileName, len);
std::string::size_type pos = result.find_last_of("\/");
result.resize(pos+1);
return result;
}
static std::string GetINIPath()
{
return GetAppFolder() + "config.ini";
}
INIParser::INIParser()
{
returntestvar = 0;
testvar = 18;
configstring = GetINIPath();
}
void INIParser::WriteINI()
{
WritePrivateProfileString("Test", "Test1", CStringify(testvar), configstring.c_str());
}
void INIParser::ReadINI()
{
returntestvar = GetPrivateProfileInt("Test", "Test1", 0, configstring.c_str());
}
我正在尝试将 WritePrivateProfileString 和 GetPrivateProfileInt 用于 .ini
解析器。
当我将下面的代码放入 main()
或 class 构造函数中时,它可以用于写入和读取。
但是,当我创建用于写入和读取的函数,并调用 main()
中的函数时,没有任何反应,尽管这些函数是 运行 因为它们会 cout
如果我要求他们。
这是我编写的测试程序来证明这一点:
#include <iostream>
#include <Windows.h>
#include <fstream>
#include <string>
#define CStringify(x) std::to_string(x).c_str()
int testvar = 12;
int returntestvar = 0;
std::fstream config;
std::string configstring = ".//config.ini";
int main()
{
WriteINI();
ReadINI();
std::cout << returntestvar << std::endl;
getchar();
}
void WriteINI()
{
config.open("config.ini", std::ios::app);
WritePrivateProfileString("Test", "Test1", CStringify(testvar), configstring.c_str());
}
void ReadINI()
{
config.open("config.ini", std::ios::app);
returntestvar = GetPrivateProfileInt("Test", "Test1", 0, configstring.c_str());
}
以上代码创建并编辑了一个 .ini
文件,正如预期的那样。
但是,如果我将代码移到 class 中,它将不再有效。
main.cpp
#include <iostream>
#include <Windows.h>
#include <fstream>
#include <string>
#include "INIClassTest.h"
extern INIParser* Parse;
int main()
{
Parse->WriteINI();
Parse->ReadINI();
std::cout << Parse->returntestvar << std::endl;
getchar();
}
INIClassTest.h
#pragma once
#include <fstream>
#include <string>
#include <Windows.h>
#define CStringify(x) std::to_string(x).c_str()
class INIParser
{
public:
INIParser();
void WriteINI();
void ReadINI();
int testvar;
int returntestvar;
std::fstream config;
std::string configstring;
};
extern INIParser* Parse;
INIClassTest.cpp
#include "INIClassTest.h"
#include <iostream>
INIParser* Parse = new INIParser();
INIParser::INIParser()
{
returntestvar = 0;
testvar = 18;
std::string configstring = ".//config.ini";
}
void INIParser::WriteINI()
{
config.open("config.ini", std::ios::app);
WritePrivateProfileString("Test", "Test1", CStringify(testvar), configstring.c_str());
}
void INIParser::ReadINI()
{
config.open("config.ini", std::ios::app);
returntestvar = GetPrivateProfileInt("Test", "Test1", 0, configstring.c_str());
}
上面的代码创建了一个 .ini
文件,但它没有编辑它或 return 任何东西。
您根本不应该使用 fstream
手动 create/open INI 文件。 WritePrivateProfileString()
和 GetPrivateProfileInt()
为您处理。
此外,如果您阅读他们的文档,您会发现不应该使用 INI 文件的相对路径,否则该文件将相对于 Windows 安装文件夹,而不是您的应用程序文件夹.因此,您可能是 reading/writing INI 文件,而不是您期望的 from/to。如果您希望您的 INI 文件相对于您的应用程序文件夹,您需要检索您的应用程序文件夹的路径 1 并将 INI 文件名附加到它。
1:但总的来说,这确实不是一个好主意。根据您安装应用程序的位置,用户可能没有对该文件夹的写入权限。您应该改为使用 SHGetFolderPath()
或 SHGetKnownFolderPath()
来获取用户的本地 %AppData%
文件夹,然后在其中创建您自己的子文件夹,然后在该子文件夹中创建您的 INI 文件。
试试这个:
#include <Windows.h>
#include <iostream>
#include <string>
#define CStringify(x) std::to_string(x).c_str()
std::string GetAppFolder();
std::string GetINIPath();
void WriteINI();
void ReadINI();
int testvar = 12;
int returntestvar = 0;
std::string configstring = GetINIPath();
int main()
{
WriteINI();
ReadINI();
std::cout << returntestvar << std::endl;
std::cin.get();
return 0;
}
std::string GetAppFolder()
{
char szFileName[MAX_PATH];
DWORD len = GetModuleFileName(NULL, szFileName, MAX_PATH);
std::string result(szFileName, len);
std::string::size_type pos = result.find_last_of("\/");
result.resize(pos+1);
return result;
}
std::string GetINIPath()
{
return GetAppFolder() + "config.ini";
}
void WriteINI()
{
WritePrivateProfileString("Test", "Test1", CStringify(testvar), configstring.c_str());
}
void ReadINI()
{
returntestvar = GetPrivateProfileInt("Test", "Test1", 0, configstring.c_str());
}
您的 INIParser
class 失败的主要原因是您的构造函数将 INI 文件路径存储在名为 configstring
的局部变量中,而不是 class的成员也叫 configstring
。因此,当调用 WriteINI()
和 ReadINI()
时,class 成员为空。
试试这个:
main.cpp
#include <iostream>
#include "INIClassTest.h"
int main()
{
Parse.WriteINI();
Parse.ReadINI();
std::cout << Parse.returntestvar << std::endl;
std::cin.get();
return 0;
}
INIClassTest.h
#pragma once
#include <string>
class INIParser
{
public:
INIParser();
void WriteINI();
void ReadINI();
int testvar;
int returntestvar;
std::string configstring;
};
extern INIParser Parse;
INIClassTest.cpp
#include <Windows.h>
#include "INIClassTest.h"
#include <string>
#define CStringify(x) std::to_string(x).c_str()
INIParser Parse;
static std::string GetAppFolder()
{
char szFileName[MAX_PATH];
DWORD len = GetModuleFileName(NULL, szFileName, MAX_PATH);
std::string result(szFileName, len);
std::string::size_type pos = result.find_last_of("\/");
result.resize(pos+1);
return result;
}
static std::string GetINIPath()
{
return GetAppFolder() + "config.ini";
}
INIParser::INIParser()
{
returntestvar = 0;
testvar = 18;
configstring = GetINIPath();
}
void INIParser::WriteINI()
{
WritePrivateProfileString("Test", "Test1", CStringify(testvar), configstring.c_str());
}
void INIParser::ReadINI()
{
returntestvar = GetPrivateProfileInt("Test", "Test1", 0, configstring.c_str());
}