我假设简单的输出重定向不是一个选项:
$ 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- 部分。
然后,将缓冲区存储在字符串列表中,并在程序结束时将此列表写入文件。
这有一些复杂性:您需要一个字符串列表(实际上,动态分配的数组就足够了);你的缓冲区必须有多大?
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,因为数据已经格式化。
我不知道是否有更简单的方法。我认为不会。