首页 > 解决方案 > 如何在 C++ 中打开以特定扩展名结尾的文件

问题描述

我正在尝试使用 flex 编写词法分析器,并希望打开并读取以特定扩展名结尾的文件。例如filename.k。如果我指定文件名和扩展名,我只能这样做。

FILE *myfile = fopen("a.k", "r");
        if (!myfile) {
        cout << "I can't open a.k!" << endl;

有人可以告诉我*.k用 C++ 打开文件的方法吗?

我在 Ubuntu 上运行 flex。我想做的是运行一个弹性程序。上面的代码执行得很好。.k我想要一种方法,无论文件名如何,我都可以打开带有扩展名的文件。例子。./myprogram a.k./myprogram b.k。在上面的示例中,我总是必须始终在代码本身中指定文件名。

标签: c++

解决方案


评论 Basile 的分析器

[...] 例如 ./myprogram ak,我想要一种可以编写任何文件名而不是 a 但以 .k 扩展名结尾的方法。

虽然引用的答案在技术上是正确的,但我认为您真正的问题是如何从命令行获取一些任意但特定的文件路径:

示例:./myprogram ak 或 ./myprogram bk

事情很简单:只要你使用接受它们的变体,你就可以将命令行参数直接传递给你的 main 函数:

int main(int argc, char* argv[]);

第一个参数 ( argv[0]) 始终是您的程序的名称(或空字符串,如果不可用),因此argc始终至少是一个。之后提供的参数如下,因此调用“./myprogram bk”将导致 argc 为 2,并且 argv 指向一个 char* 数组,如下所示:

char* argv[] =
{
    "./myprogram",
    "b.k",
    nullptr // oh, yes, the array is always null terminated...
};

然后,事情就变得简单了:检查是否给出了参数:)if(argc == 2或者,如果您愿意接受但忽略任何其他参数,if(argc >= 2)或者简单地说if(argv[1])nullptr如果没有给出参数,或者第一个否则参数),然后将其用于,fopen或者,如果您更喜欢类似 C++ 的方式,则打开一个std::ifstream. 您可能想要进行额外的检查,例如文件名是否真的以 结尾".k",但这取决于您现在...


推荐阅读