【问题标题】:Write an entire program to a file in C将整个程序写入 C 中的文件
【发布时间】:2014-12-28 22:49:52
【问题描述】:

我对 C 编程很陌生,但我开始掌握它的窍门。 对于学校作业,我用 C 语言编写了一段代码来玩二十一点。 分配的要求之一是必须有一个选项来保存整个输出(在构建和运行程序时显示在 cmd 中的所有内容)。 我在任何地方都找不到如何做到这一点。

有没有办法将整个输出写入文件?

提前致谢!

【问题讨论】:

  • stdoutstderr 是命令输入窗口中显示的内容。
  • 您可以将其存储在程序中的某个位置,也可以将标准输出写入文件。像这样 MyProgram > out.log
  • @ruler501 将标准输出写入文件是什么意思?我以前没有使用过 stdout,但它似乎是 printf() 的替代品,如 printf( "hello world\n" ); fprintf( stdout, "hello world\ n" ); MyProgram > out.log 是什么意思?感谢您的帮助:)
  • 这真的不是C 问题,而是cmd shell 问题。

标签: c file output


【解决方案1】:

有 3 种方法可以实现您想要的。

  1. 使用文件。这是我推荐的方式。您将需要函数fopen 来打开文件并使用enter link description here 来打印文件中的数据。我建议您阅读链接中的函数文档并查看示例。

  2. 使用freopen 将标准输出重定向到文件。这基本上将您现在在控制台中看到的所有内容都放在一个文件中,只需添加一行。

  3. 在文件中重定向程序的输出。这与其说是一种 C 编程技术,不如说是一种 shell,但我认为值得一提。在 *NIX 环境中,命令 ./a.out > file.txt 会将 a.out 的输出重定向到名为 file.txt 的文件,其方式与 freopen 类似。

【讨论】:

  • 您好!谢谢你的帮助。第一个和第二个选项看起来都不错,但仍然存在问题。程序是否必须保存到文件必须在程序结束时声明。这两个选项的问题是我必须在程序开始时命名一个文件(当我打开文件时)。有没有办法决定保存它并在程序末尾输入一个名称?提前致谢!
  • 程序必须知道将数据保存在哪里(打开哪个文件),所以不,在生成输出后您无法打开文件,我不明白为什么您必须这样做.您可以简单地更改程序的工作方式并在开头询问文件名。但是,如果您真的必须这样做,您必须生成输出并以某种方式存储它。您可以将输出存储在 char 数组中并在最后将其写入文件,或者创建一个临时文件并使用一些系统调用重命名它。
【解决方案2】:

您可以在构建和运行时将 stdout 和 stderr 通过管道传输到文件中。例如,在使用 bash shell 的 Linux 上,您可以试试这个(其中“build_script”是您用来构建的,“a.exe”是程序名称):

$ ./build_script >& build_out.txt
$ ./a.exe >& run_out.txt &

“>&”告诉 bash 将 stdout 和 stderr 都通过管道传输到文件中。第二行最后的“&”告诉 bash 在后台运行程序。很难判断这个答案是否适合您的目的,因为从您发布的内容中不清楚游戏的确切玩法。例如,如果您需要使用标准输入/标准输出来玩游戏,那么将“a.exe”标准输出通过管道传输到文件可能无法正常工作......

【讨论】:

    【解决方案3】:

    我假设简单的输出重定向不是一个选项:

    $ app > file.txt
    

    您可能正在使用printf 将数据打印到控制台。您可以使用fprintf 而不是printffprintf 可以将数据写入任意文件,就像printf 对标准输出(也是一个文件)所做的那样,在本例中是控制台。

    您必须首先打开要写入输出的文件。命令fopen 将为您执行此操作:

    // this will open or create the file as text to write data.
    FILE *f = fopen("my-file.txt", "w");
    

    使用f 变量(如果出现错误,您应该检查NULL),您可以将其传递给fprintf 以写入数据:

    fprintf(f, "my super string: %s", string);
    

    请注意,尽管第一个参数是 FILE*,但其他所有参数的行为都类似于 printf。实际上,您可以将printf 视为一个包装器,其中fprintf 的第一个参数始终是stdout

    写入数据后不要忘记关闭文件!

    fclose(f);
    

    这可以在所有数据写入文件后执行一次。

    查看手册页以获取有关这些命令的更多信息。

    有更复杂的(实际上并没有那么多)方法来实现这一点,比如使用freopen,但我没有回答这个问题。如果您需要更多,请更新您的答案。

    编辑

    在您的评论中,您说您必须在程序结束时将输出保存或不保存到文件中。好吧,你上面的文件管理东西还是有用的。变化如下:

    您必须将输出存储在某处,以便在程序结束时决定是否写入文件。可能您正在使用printf 进行一些数据格式化。您必须将呼叫从 printf 更改为 snprintf。此命令会将您的数据写入字符串,就像 printf 在将其输出到 stdout 之前所做的那样,但它会跳过 print-to-output- 部分。

    然后,将缓冲区存储在字符串列表中,并在程序结束时将此列表写入文件。

    这有一些复杂性:您需要一个字符串列表(实际上,动态分配的数组就足够了);你的缓冲区必须有多大?

    snprintf 将返回将传递的数据打印到缓冲区所需的大小,无论缓冲区大于还是小于给定的缓冲区。但是,如果它更小,您将不得不增加它的大小(重新分配它)并再次调用snprintf

    char *buffer = malloc(sizeof(char) * 41); // 40 chars + \0!
    int size;
    if ( size = snprintf(buffer, 41, "your format here", args) > 40 ) {
        buffer = realloc(buffer, sizeof(char) * (size + 1));
        snprintf(buffer, size + 1, "your format here", args);
    }
    // now your buffer have the correct data!
    // print it to stdout!
    puts(buffer);
    // store it at the string list.
    // execise!
    

    作为练习将这段代码包装在一个命令中,以避免在打印任何内容的任何地方重复它。另外,创建字符串列表也是一个练习。

    当您决定将数据写入文件时,可以使用fputs 而不是使用fprintf,因为数据已经格式化。

    我不知道是否有更简单的方法。我认为不会。

    【讨论】:

    • 您好!您描述的方式似乎还可以,但是仍然存在问题。程序是否必须保存到文件必须在程序结束时声明。这个选项的问题是我必须在程序开始时命名一个文件(当我打开文件时)。有没有办法决定保存它并在程序末尾输入一个名称?提前致谢!
    • 看看可以编辑。我强烈假设这是一个只能用 C 来完成的练习。希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2021-02-16
    • 2014-01-29
    • 2010-10-09
    • 2016-02-19
    • 2016-08-05
    相关资源
    最近更新 更多