如何在C ++中打开以特定扩展名结尾的文件

时间:2018-05-11 06:56:58

标签: c++

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

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

有人可以告诉我在C ++中打开*.k文件的方法。

我在Ubuntu上运行flex。我想要做的是运行flex程序。上面的代码执行正常。我想要一种方法,我可以打开一个.k扩展名的文件,而不管文件名是什么。例。 ./myprogram a.k./myprogram b.k。在上面的例子中,我总是必须始终在代码本身中指定文件名。

1 个答案:

答案 0 :(得分:2)

您的fopen代码很好,但在条件下(例如在一些奇怪的working directory或没有足够权限的情况下)会导致fopen失败。

我建议在失败案例中使用errno(可能隐式通过perror)来了解失败原因:

FILE *myfile = fopen("a.k", "r");
if (!myfile) {
     perror("fopen of a.k"); 
     exit(EXIT_FAILURE);
}

参见例如fopen(3)perror(3)errno(3)(或其特定实施和系统的文档)。

请注意,文件扩展名并不存在于标准C ++ 11中(但C ++ 17具有filesystem)。在Linux和POSIX系统上,文件扩展名只是约定

  

有人可以告诉我在C ++中打开* .k文件的方法。

如果您需要打开.k扩展名的所有文件,您可以依赖globbing(在POSIX上,在您的shell中运行类似yourprog *.k的内容,展开 *.k到运行程序之前以.k结尾的文件名序列,其main将获得一组参数;请参阅glob(7)),或者你必须使用操作系统原语或函数显式循环(可能在Linux上使用glob(3)nftw(3)opendir(3)readdir(3),...;对于Windows,请阅读{ {3}} ...)

标准C ++ 11没有提供迭代匹配给定模式的所有文件的方法。一些框架库(FindFirstFile etcBoostPoco)确实提供了这种方式。或者您需要使用特定于操作系统的函数(例如,读取当前Qt。但目录不为C ++ 11所知,并且是操作系统提供的抽象)。但是C ++ 17有directory,但你需要一个非常新的编译器和C ++标准库来实现它。

顺便说一下,在Unix或POSIX系统上,你可以有一个名为*.k的文件。当然这是非常差的味道,应该避免(但你可以在你的shell中运行touch '*.k'来制作这样的文件)。

关于您的编辑,对于Linux,我建议运行

./myprogram *.k

(然后你的shell会将*.k扩展为myprogram的一个或多个参数 并适当地编写程序main的{​​{1}}来迭代参数。请参阅filesystem

如果你想只运行myprog而没有任何额外的参数,你需要编写其中的globbing或扩展。请参阅thisglob(3)。或扫描目录(使用wordexp(3)opendir(3)myprogramreaddir(3)stat(2)

相关问题