【问题标题】:How to provide the output of the first input file as the second input file in one pass in C?如何在 C 中一次性提供第一个输入文件的输出作为第二个输入文件?
【发布时间】: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


【解决方案1】:

创建一个管道并打开它进行写入并将其分配给 yyout 并打开管道进行读取并将其分配给 yyin 见http://www.gnu.org/software/libc/manual/html_node/Creating-a-Pipe.html

【讨论】:

  • 非常感谢这个链接和回复。会让你知道它是否有效。希望它适用于 lex。再次感谢。
  • 注意查找特定于平台的文档。
  • 我没有使用管道,但我对我的代码做了一个解决方法。它现在正在工作。也可以使用管道来完成。类似的方法。再次感谢。已标记。
  • 我很想知道另一种选择。也许您可以将其发布为普遍利益的答案。
  • 嘿塔里克,我已经发布了。谢了哥们。干杯。
【解决方案2】:

类似于最初发布的代码。代码后面的改动我已经解释过了。

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

我只是做了一些小改动,效果很好,但花了一些时间!

干杯。

【讨论】:

  • 我花了时间和精力来指导您找到解决方案,最终摆脱我们可以从这个网站获得的卑微满足感。你认为这合乎道德吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多