当这个循环返回了核心转储的分段错误时,我试图实现flex和bison 使用第一个文件,它工作正常,但下一个文件崩溃并打印成终端分段错误。
DIR *dir;
struct dirent *ent;
if ((dir = opendir ("./Corpus")) != NULL)
{
while ((ent = readdir (dir)) != NULL)
{
if ((strcmp(ent->d_name,".") != 0) && (strcmp(ent->d_name,"..") != 0))
{
printf("%s\n",ent->d_name);
yyin = fopen(ent->d_name,"r");
yyparse();
}
}
closedir (dir);
}
else
{
// could not open directory
perror ("");
return EXIT_FAILURE;
}
答案 0 :(得分:1)
如果您使用的是flex
的合理最新版本,则切换输入文件的方式没有任何问题。但是,如果没有看到更多代码,就无法确定问题是什么。
一个明显的问题是,在调用yyin
后,您不会检查fopen
的值。如果打开失败(可能会在下面看到),那么yyin
将为NULL
,当flex
尝试阅读时,肯定会产生段错误。
此外,您似乎没有关闭yyin
,这会泄漏文件描述符。这应该不是第二个文件的问题,但最终会因缺少文件描述符而导致open失败。
fopen
的问题是ent->d_name
只是文件的基本名称,没有任何路径。因此fopen
将在当前工作目录中搜索该文件。但是,正在读取的目录是./Corpus
,这是一个子目录;除非文件在Corpus和主目录之间重复,否则将无法找到该文件。
为了评论员的利益,Flex manual州:
如果扫描程序到达文件结尾,则后续调用是未定义的,除非yyin指向新的输入文件(在这种情况下扫描从该文件继续)...基本上只是将yyin分配给a新输入文件或使用yyrestart()来执行此操作;后者可与以前版本的flex兼容,因为它可用于在扫描过程中切换输入文件。
段错误也可能与文件处理无关。最好使用调试器来确定段错误的确切位置。