繁体   English   中英

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

[英]Write an entire program to a file in C

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

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

提前致谢!

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

  1. 使用文件。 这是我推荐的方式。 您将需要使用fopen函数来打开文件,并在此处输入链接描述以在文件中打印数据。 我建议您阅读链接中的功能文档并查看示例。

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

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

生成和运行时,可以将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” stdout传递到文件中。

我假设没有简单的输出重定向选项:

$ app > file.txt

可能您正在使用printf将数据打印到控制台。 可以使用fprintf代替printf fprintf可以将数据写入任意文件,就像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-part。

然后,将缓冲区存储在字符串列表中,并在程序末尾将此列表写入文件或不写入文件。

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

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 ,因为数据已经格式化。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM