【发布时间】:2013-08-13 06:40:33
【问题描述】:
假设我有一个名为 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() 行中的注释。
如果有其他方法可以解决我的问题,请告诉我。
谢谢。
【问题讨论】:
-
我怀疑你会想要
temp = (char *)malloc(strlen(name)+1); -
感谢 chux 的回复。为什么以及在哪里想要那个?能否请您详细说明。
-
无法详细说明,因为在这一点上您似乎还可以。尼特:
len是一个问题,如果name在“”中异常短,但是 argv[1] 需要是“”。嗯,不知道这是否可能? ProgramName "" 可能吗? -
嘿 Chux,我解决了这个问题。刚刚做了一个解决方法。奇怪的。虽然得到了答案。干杯。
标签: c file file-io lex file-handling