假设我有一个名为1.lex的文件。提供输入文件1.c.输出是下一个输入。我希望在一次传递中发生这种情况,因为在生成第一个输出时,内存缓冲区包含第二个输入文件所需的一些信息。
以下是上述情况的文件处理代码。
char * basename(char *name)
{
char *temp;
int i=0, j=0, len;
temp = (char *)malloc(strlen(name));
len = strlen(name);
len--;
while(1)
{
if(name[len] != '.')
len--;
else
{
for( i = 0; i < len; i++)
temp[j++] = name[i];
break;
}
}
temp[j] = '\0';
return temp;
}
int main(int argc, char** argv)
{
if(argc != 2)
{
fprintf(stderr,"Usage: filename\n");
exit(1);
}
yyin = fopen(argv[1],"r");
if(yyin == NULL)
{
fprintf(stderr,"cannot open file: %s",argv[1]);
exit(0);
}
file = basename(argv[1]);
realloc(file, strlen(file)+10);
strcat(file,".met");
yyout = fopen(file,"w");
yyparse();
return 0;
}
int yywrap()
{
fclose(yyin);
yyin = fopen(file,"r");
if(yyin == NULL)
{
fprintf(stderr,"cannot open file: %s",file);
exit(0);
}
file = basename(file);
realloc(file, strlen(file)+10);
strcat(file,".meta");
yyout = fopen(file,"w");
yyparse();
return 1;
}
如果我在yywrap()函数中评论yyparse(),则没有分段错误,但没有任何内容写入“.meta”文件,但是第一个o / p文件“.met”被写入。如果我取消注释,则存在分段错误,并且没有任何内容写入“.met”文件。
函数“basename”用于获取输入的基本名称。
函数main()打开第一个文件并调用yyparse()。
当yyparse()完成第一个文件时,它会调用yywrap(),这会打开下一个文件。
请在yyparse()行中查看上面的注释。
如果有其他方法可以解决我的问题,请告诉我。
感谢。
答案 0 :(得分:1)
创建一个管道并打开它进行写入并将其分配给yyout并打开管道进行读取并将其分配给yyin 见http://www.gnu.org/software/libc/manual/html_node/Creating-a-Pipe.html
答案 1 :(得分:1)
与最初发布的代码类似。我在代码之后解释了这些变化。
int main(int argc, char** argv)
{
file_num++;
argc = file_num_max;
if(argc != 2)
{
fprintf(stderr,"Usage: filename\n");
exit(1);
}
yyin = fopen(argv[1],"r");
if(yyin == NULL)
{
fprintf(stderr,"cannot open file: %s",argv[1]);
exit(0);
}
file = basename(argv[1]);
realloc(file, strlen(file)+10);
strcat(file,".met");
yyout = fopen(file,"w");
while(yylex())
;
return 0;
}
int yywrap()
{
fclose(yyin);
fclose(yyout);
yyin = fopen(file,"r");
if(++file_num <= file_num_max)
{
if(yyin == NULL)
{
fprintf(stderr,"cannot open file: %s",file);
exit(0);
}
file = basename(file);
realloc(file, strlen(file)+10);
strcat(file,".meta");
yyout = fopen(file,"w");
return 0;
} else {
return 1;
}
}
如前所述,函数main()打开第一个文件并调用yylex()。
当yylex()完成第一个文件时,它调用yywrap(),打开下一个文件,yylex()继续。
当yywrap()耗尽所有命令行参数时,它返回1和yylex()。
我只是做了一些小的修改但它有效但是花了一些时间!
干杯。