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());
}