【问题标题】:Implicit file extension using fopen in C++在 C++ 中使用 fopen 隐式文件扩展名
【发布时间】:2016-02-05 19:56:44
【问题描述】:

我正在做一个项目,我需要从扩展名为“.input”的文件中获取输入。运行时,用户提供不带文件扩展名的文件名作为命令行参数。然后,我采用该参数 argv[1] 并打开指定的文件,但如果用户不输入整个文件名,我就无法让它工作

例如:

用户输入> 运行 file.input //“run”是可执行文件,“file.input”是文件名

用户应该进入>运行文件

如何在使用此代码时获得隐含的文件扩展名:

fopen(argv[1],"r");

我尝试使用字符串,将其设置为 argv[1],然后将“.input”附加到它,但 fopen 不会接受该字符串。

【问题讨论】:

  • 你能具体告诉我们你尝试了什么吗?那应该行得通。另外,您使用 fopenFILE* 而不是 ifstream 的任何原因?
  • 你需要的是基本的字符串操作,任何更好的 C++ 教程都应该解释。但是,它无法解释使用 fopen() 的文件操作,因此您可能使用 C 或者您正在学习的源代码不好。
  • 我的老师建议使用 fopen(),但他确实倾向于更多地谈论 c 而不是 c++,所以也许这就是原因。
  • 你需要一个新的文件名变量。

标签: c++ string fopen


【解决方案1】:

没有看到你的代码,我不能确定出了什么问题,但我怀疑你做了这样的事情:

string filename = argv[1];
filename += ".input";

FILE* f = fopen(filename, "r"); // <--- Error here

这里的问题是 C++ std::string 类型不是 char *,这是 fopen 所期望的。要解决此问题,您可以使用 std::string 类型的 .c_str() 成员函数,它返回一个以空字符结尾的 C 样式字符串:

FILE* f = fopen(filename.c_str(), "r"); // No more errors!

不过,正如我在评论中提到的,我认为您最好使用ifstream

string filename = argv[1];
filename += ".input";
ifstream input(filename);

不再需要.c_str(),也不用担心资源泄露。一切都为您管理。另外,它是类型安全的!

【讨论】:

  • 非常感谢,它运行良好。我不习惯处理读取文件,我习惯于使用普通的旧字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2011-07-12
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多