【问题标题】:SHELL, Save echo's output in to a file (c code)?SHELL,将 echo 的输出保存到文件中(c 代码)?
【发布时间】:2010-12-09 02:49:25
【问题描述】:

我试图编写一个 shell 程序(在 c 中)并遇到了以下问题。谁能告诉我如何将echo 的输出保存到文件中。例如,有人可能会输入echo document_this > foo1,然后我想将document_this 保存到文件名foo1 中。

if(strcmp(myargv[0],"echo") == 0)
{
   printf("Saving: %s in to a file", myargv[1]);
   .
   .
   .
}

任何帮助将不胜感激。不能使用#include <fstream>,还有什么我应该使用的吗?谢谢。

【问题讨论】:

    标签: c shell unix


    【解决方案1】:

    您应该将重定向检查与命令本身分开。首先,循环检查重定向:

    FILE* output = stdin;
    
    for (int i = 0; i < myargc - 1; ++i)
        if (strcmp(myargv[i], ">") == 0)
        {
             output = fopen(myargv[i + 1], "w");
             myargc = i; // remove '>' onwards from command...
             break;
        }
    
    // now output will be either stdin or a newly opened file 
    
    // evaluate the actual command
    
    if (strcmp(myargv[0], "echo") == 0)
        for (int i = 1; i < myargc; ++i) // rest of arguments...
        {
             fwrite(myargv[i], strlen(myargv[i]), 1, output);
    
             // space between arguments, newline afterwards
             fputc(i < myargc - 2 ? ' ' : '\n', output);
        }
    else if (... next command ...)
        ...
    
    // close the output file if necessary
    if (output != stdin)
        fclose(output);
    

    添加适当的错误检查留作练习。

    【讨论】:

    • 非常感谢您的精彩解释。但是 fputc(..) 函数似乎不起作用。它说“错误:函数‘fputc’的参数太少
    • @NewGuy:嗯,正如错误消息告诉你的那样,它缺少一个参数,如果你查看文档 (linux.die.net/man/3/fputc),你可以很容易地看到缺少的参数应该是 @987654323 @.
    • @NewGuy,@Adam:啊,是的......对此感到抱歉......感谢亚当的编辑。加上其他一些小的修正——可能还需要一两个;-)。
    • 感谢 cmets 的回答,非常有帮助。
    • @NewGuy:别担心……玩得开心。
    【解决方案2】:

    打开名为foo1 的文件进行写入,写入其内容,然后关闭文件。

    【讨论】:

    • 由于您不想考虑的原因,shell 的实际工作方式要复杂得多。这是实现您想要的简单路径。
    【解决方案3】:

    您似乎将输出逻辑与命令逻辑捆绑在一起,一旦您拥有多个命令,这将无法正常工作。处理完该行后,首先编写 echo 的逻辑,如“将其参数复制到 output”,然后决定如何处理 output(写入文件或打印到屏幕)。

    当然这是一个非常基本的编写shell的方法。

    【讨论】:

      【解决方案4】:

      你不能在 C 程序中使用&lt;fstream&gt;;它是一个 C++ 头文件。

      您需要使用&lt;stdio.h&gt;,并且您需要使用fprintf() 而不仅仅是printf()。您打开一个文件('foo1')并写入该文件而不是标准输出。因此,您将拥有一个“当前输出文件”,默认情况下您可以将其定向到标准输出,但也可以按需定向到其他文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 2014-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多