在 C++ 中使用 fopen 的隐式文件扩展名
Implicit file extension using fopen in C++
我正在做一个项目,我需要从扩展名为“.input”的文件中获取输入。当 运行 时,用户将不带文件扩展名的文件名作为命令行参数。然后我接受那个参数 argv[1] 并打开指定的文件但是如果用户不输入整个文件名我就无法让它工作
例如:
用户输入> 运行 file.input
//"run"是可执行文件,"file.input"是文件名
用户应该输入 > 运行 文件
如何在使用此代码时隐含此文件扩展名:
fopen(argv[1],"r");
我尝试使用字符串,将其设置为 argv[1],然后向其附加“.input”,但 fopen 不接受该字符串。
没有看到你的代码,我不能确定哪里出了问题,但我怀疑你做了这样的事情:
string filename = argv[1];
filename += ".input";
FILE* f = fopen(filename, "r"); // <--- Error here
这里的问题是 C++ std::string
类型不是 char *
,这是 fopen
所期望的。要解决此问题,您可以使用 std::string
类型的 .c_str()
成员函数,它会返回一个以 null 结尾的 C 风格字符串:
FILE* f = fopen(filename.c_str(), "r"); // No more errors!
不过,正如我在评论中提到的,我认为你最好只使用 ifstream
:
string filename = argv[1];
filename += ".input";
ifstream input(filename);
不再需要 .c_str()
,您无需担心资源泄漏。一切都为您管理。另外,它是类型安全的!
我正在做一个项目,我需要从扩展名为“.input”的文件中获取输入。当 运行 时,用户将不带文件扩展名的文件名作为命令行参数。然后我接受那个参数 argv[1] 并打开指定的文件但是如果用户不输入整个文件名我就无法让它工作
例如:
用户输入> 运行 file.input //"run"是可执行文件,"file.input"是文件名
用户应该输入 > 运行 文件
如何在使用此代码时隐含此文件扩展名:
fopen(argv[1],"r");
我尝试使用字符串,将其设置为 argv[1],然后向其附加“.input”,但 fopen 不接受该字符串。
没有看到你的代码,我不能确定哪里出了问题,但我怀疑你做了这样的事情:
string filename = argv[1];
filename += ".input";
FILE* f = fopen(filename, "r"); // <--- Error here
这里的问题是 C++ std::string
类型不是 char *
,这是 fopen
所期望的。要解决此问题,您可以使用 std::string
类型的 .c_str()
成员函数,它会返回一个以 null 结尾的 C 风格字符串:
FILE* f = fopen(filename.c_str(), "r"); // No more errors!
不过,正如我在评论中提到的,我认为你最好只使用 ifstream
:
string filename = argv[1];
filename += ".input";
ifstream input(filename);
不再需要 .c_str()
,您无需担心资源泄漏。一切都为您管理。另外,它是类型安全的!