【问题标题】:How to link input text file to C++ program如何将输入文本文件链接到 C++ 程序
【发布时间】:2019-04-11 11:56:56
【问题描述】:

我正在尝试在 CLion 中编写一个 C++ 程序,用于打开、操作和关闭输入文件和输出文件。输入文件是一个 .txt 文件,但是当我执行程序时,即使它与正在执行的 .cpp 程序位于同一目录中,它也找不到输入文件。我想知道是否是因为我必须将输入文件与 CMake 链接,但不幸的是我不熟悉配置 CMake。如何将 .txt 文件链接到 C++ 项目?

【问题讨论】:

  • 您的可执行文件可能未与您尝试读取的文本文件链接。请出示代码。
  • 运行时发生的事情与您如何编译或链接程序无关。如何打开你要阅读的文件?
  • 在一些奇特的环境中存在资源文件“链接”。我说“可能不会”。
  • @TedLyngmo 有问题的“异国环境”是 Windows。所以我们将讨论资源编译器。但我对此表示怀疑。
  • 您的程序使用文件名打开了一个文件,没有目录。如果您从文件所在的目录运行程序,这将起作用。请澄清您的问题帖子。目前,您不清楚您拥有什么以及您想要实现什么。短语“链接输入文件”本身并不清楚,无助于理解问题。如果您不知道正确的措辞,请显示代码中显示问题的某些部分。

标签: c++ windows cmake io clion


【解决方案1】:

您不会将文本文件“链接”到可执行文件。在 CLion 中,默认行为是将项目二进制文件构建到名为 cmake-build-debug 的文件夹中。您要用作输入的文本文件必须与.exe 文件位于同一目录中,而不是.cpp,因此在这种情况下,您必须在名称前面加上../文本文件(即..如果您的文件名为input.txt,C 代码会说类似

FILE* input_file = fopen("../input.txt", "r");

记得检查返回码、错误等


上面的解决方案不好,原因有很多;首先,您正在对文件名进行硬编码,这充其量是一个巨大的限制,最坏的情况是毫无意义。更好的解决方案是通过命令行传入文件名。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if (argc != 2) { return EXIT_FAILURE; }

    FILE* inputFile = fopen(argv[1], "r");

    ...

    return EXIT_SUCCESS;
}

然而,这个解决方案仍然不是很好,主要是因为您应该始终清理您的输入,而不是仅仅接受用户的字符串输入并立即使用它。这是一个巨大的安全责任。我也没有检查返回码或任何东西;我只是验证了argc 是两个。 (请记住,程序的argc 至少等于1,因为第一个参数是程序的名称。)


要回答您的实际问题(您提出的问题,但不一定是您需要回答的问题),您可以使用 CMake 的 find_file function 来“链接”到文件。你实际上并没有链接任何东西,实际上,find_file 函数只是返回一个命名文件的完整路径,但是你可以像前面讨论的那样将此信息作为参数传递给你的程序。

实际上,使用 CMake,您可以做的不仅仅是显而易见的事情; here 是他们文件相关函数的文档。

您也可以使用execute_process 函数直接从CMake 执行您新建的程序。该函数实际上直接采用INPUT_FILE参数,因此您可以为输入文件的路径设置一个变量,使用find_file的结果设置它,然后使用execute_process直接使用您的输入文件执行程序。

【讨论】:

  • 谢谢!我还就这个问题联系了 JetBrains,他们也说了同样的话。我只是将输入文件放在cmake-build-debug 目录中,运行程序,并在那里创建了输出文件。这很有帮助,而且您的回复非常详细。此外,我的程序从特定文件中获取字符串的原因是因为这是我的大学 C++ 课程所需要的。希望我们能学到更高级的方法来使用输入文件。再次感谢您的回答!
猜你喜欢
  • 2013-05-25
  • 2017-07-10
  • 2013-11-14
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多