将整个程序写入C中的文件

时间:2014-12-28 22:49:53

标签: c file output

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

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

提前致谢!

3 个答案:

答案 0 :(得分:1)

有三种方法可以达到你想要的效果。

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

  2. 使用freopen将stdout重定向到文件。这通常只需添加一行,就可以将您现在在控制台中看到的所有内容放在一个文件中。

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

答案 1 :(得分:1)

您可以在构建和运行时将stdout和stderr传递给文件。例如,在使用bash shell的Linux上,您可以尝试这样做(其中“build_script”是您用来构建的,“a.exe”是程序名称):

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

“>&”告诉bash将stdout和stderr都传递给文件。最后的“&”在第二行告诉bash在后台运行程序。很难说这个答案是否适合您的目的,因为不清楚游戏是如何根据您发布的内容进行播放的。例如,如果您需要使用stdin / stdout来玩游戏,那么将“a.exe”标准输出管道传输到文件可能无效...

答案 2 :(得分:1)

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

$ app > file.txt

您可能正在使用printf将数据打印到控制台。您可以使用printf代替fprintffprintf可以将数据写入任意文件,就像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之前所做的那样,但它将跳过打印到输出部分。

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

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

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!

将这段代码包含在一个命令中,以避免在打印任何内容时重复此操作。此外,这是一个创建字符串列表的练习。

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

我不知道是否有更简单的方法。我想不是。