我正在尝试使用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
。在上面的例子中,我总是必须始终在代码本身中指定文件名。
答案 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 etc,Boost,Poco)确实提供了这种方式。或者您需要使用特定于操作系统的函数(例如,读取当前Qt。但目录不为C ++ 11所知,并且是操作系统提供的抽象)。但是C ++ 17有directory,但你需要一个非常新的编译器和C ++标准库来实现它。
顺便说一下,在Unix或POSIX系统上,你可以有一个名为*.k
的文件。当然这是非常差的味道,应该避免(但你可以在你的shell中运行touch '*.k'
来制作这样的文件)。
关于您的编辑,对于Linux,我建议运行
./myprogram *.k
(然后你的shell会将*.k
扩展为myprogram
的一个或多个参数
并适当地编写程序main
的{{1}}来迭代参数。请参阅filesystem。
如果你想只运行myprog
而没有任何额外的参数,你需要编写其中的globbing或扩展。请参阅this,glob(3)。或扫描目录(使用wordexp(3),opendir(3),myprogram
,readdir(3)或stat(2))