【问题标题】:Read ini file C++ error读取ini文件C++错误
【发布时间】:2014-02-13 23:34:50
【问题描述】:

我有一个包含以下信息的 ini 文件: 这是我的代码:

#include "stdafx.h"
#include "iostream"
#include <stdio.h>
#include "IniReader.h"
#include "INIReader.h"

using namespace std;
int main(int argc, char * argv[])
{
    INIReader reader("C:\SampleFile.ini");

    if (reader.ParseError() < 0) {
   cout << "Can't load 'test.ini'\n";
        return 1;
    }
    std::cout << "Config loaded from 'test.ini': version="
              << reader.GetInteger("info", "CaptureDuration", -1) << "CaptureDuration"<<"\n"
              << reader.Get("info", "DayStart", `enter code here`"UNKNOWN") << ", email="; 


cin.get();
 return 0;   
}

我还附上了我从这个链接中找到的 INIReader 头文件: https://code.google.com/p/inih/source/browse/trunk/cpp/INIReader.h 我希望代码打印从 ini 文件中获取的整数和字符串值。但我收到链接器错误。我该如何解决?

Errors:
,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?Get@INIReader@@QAE?AV?$

1>main.obj : error LNK2019: unresolved external symbol "public: int __thiscall INIReader::ParseError(void)" (?ParseError@INIReader@@QAEHXZ) referenced in function _main
@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function _main

1>C:\Users\Owner1\Documents\Visual Studio 2008\Projects\inireader\Debug\inireader.exe : fatal error LNK1120: 4 unresolved externals

我没有看到任何链接到这个项目的 lib 文件,我应该从哪里获得这些 lib 文件?

【问题讨论】:

  • #include 语句使用尖括号&lt;...&gt;
  • 摆脱 25 年前重要的文件格式非常困难。读取 INI 文件非常昂贵,单个设置需要 20 到 50 毫秒。让我们都责怪 C++ 编译器认为 \S 是一个有效字符,也很难摆脱。
  • @HansPassant : 20ms 大约是任何合理硬盘上的平均寻道 + 延迟。 - 或者您是说 Windows API 很慢?但是,如果性能和易于手动调整很重要,那么有什么更好的选择呢? (如果你说 XML 或注册表,我可能会笑...)

标签: c++ ini


【解决方案1】:

LNK2019 通常有以下原因之一:

  • 您忘记为您的库(在本例中为 ini 阅读器)链接正确的 lib 文件。
  • 您为库链接了错误的 lib 文件(例如,静态链接与动态链接)。
  • 您忘记将库的 cpp 文件添加到项目中。
  • 您正在混合适用于不同平台(如 x86 和 x64)的预编译代码。

编辑: 在这种特殊情况下,您必须将文件 IniReader.cpp 添加到您的项目中,因为它提供了缺少的功能。

【讨论】:

  • 谢谢。但是我在哪里可以找到 lib 文件。通常我会在调试中找到它们并将它们附加到项目中,但我在这里看不到它们。
  • 我想使用 CaptureDuration=GetPrivateProfileInt("info", "CaptureDuration", 143, "C:\SampleFile.ini");但它在这里打印默认数字而不是 ini 文件中的数字。我能做什么?
  • 您必须将 IniReader.cpp 添加到您的项目中。
  • @user2748701,一种方法是将 .cpp 添加到您的项目中。如果您不想在项目中包含源代码,则应将类 IniReader 添加到一个空项目并编译该项目以获取 dll 和 libs。
【解决方案2】:

使用GetPrivateProfileStringWritePrivateProfileString 等Windows API 来读取.ini 文件。它工作正常,不需要任何库。我用了几十年。

【讨论】:

  • 祝你好运在另一个平台上尝试。 :) 但是,对于一些仅限 Windows 的程序,我猜它们是最好的方法。
  • 初始帖子包含 stdafx.h... 这看起来是一个 Windows 项目。
  • 我使用了 GetPrivateProfileString,但它打印的是我在函数中写入的数字,而不是文件中的数字。它打印 1057 和 143!使用命名空间标准; int main(int argc, _TCHAR *argv[]) { char DayStart[1000];整数捕获持续时间; GetPrivateProfileString("info", "DayStart","1057",DayStart, 255,"C:\SampleFile.ini"); CaptureDuration=GetPrivateProfileInt("info", "CaptureDuration", 143, "C:\SampleFile.ini"); // 注意WritePrivateProfileInt() 不存在 cout
  • 我在您的代码中看不到问题。它应该工作。在调试器中检查返回的数据。您的问题“它打印数字”与这些 API 无关。 API 很好。
【解决方案3】:

最简单的方法是:

  • inih的所有文件复制到你的项目目录(我认为是C:\Users\Owner1\Documents\Visual Studio 2008\Projects\inireader)
  • inih 的所有文件拖到Visual Studio 2008 中的项目中。
  • 然后按build按钮。

错误的原因就像@Mario所说的那样。您刚刚编译了您的 cpp 文件,但没有编译您的项目所需的其他 cpp 文件。所以你还需要编译inih中的所有.cpp文件。

注意:我认为您应该阅读 this 以了解更多关于 C 的编译和链接的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多