如何在C中的一次传递中提供第一个输入文件的输出作为第二个输入文件?

时间:2013-08-12 02:23:38

标签: c file file-io lex file-handling

假设我有一个名为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()行中查看上面的注释。

如果有其他方法可以解决我的问题,请告诉我。

感谢。

2 个答案:

答案 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()。

我只是做了一些小的修改但它有效但是花了一些时间!

干杯。