![](/img/trans.png)
[英]How to copy or write an entire file to another file using 'BUFSIZ' in C program?
[英]Write an entire program to a file in C
我是C编程的新手,但是我开始理解它了。 对于学校作业,我用C语言编写了一个玩二十一点的代码。 分配的要求之一是,必须有一个选项来保存整个输出(在构建和运行程序时,cmd中显示的所有内容)。 我在任何地方都找不到怎么做。
有没有办法将整个输出写入文件?
提前致谢!
生成和运行时,可以将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.