行为printf()似乎取决于的位置stdout.
stdout发送到控制台,则printf()行缓冲并在打印换行符后刷新.stdout被重定向到文件,则除非fflush()被调用,否则不刷新缓冲区.printf()在stdout重定向到文件之前使用,则后续写入(对文件)是行缓冲的并在换行后刷新.何时进行stdout行缓冲,什么时候fflush()需要调用?
void RedirectStdout2File(const char* log_path) {
int fd = open(log_path, O_RDWR|O_APPEND|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);
dup2(fd,STDOUT_FILENO);
if (fd != STDOUT_FILENO) close(fd);
}
int main_1(int argc, char* argv[]) {
/* Case 1: stdout is line-buffered when run from console */
printf("No redirect; printed immediately\n");
sleep(10);
}
int main_2a(int argc, char* argv[]) {
/* Case 2a: stdout is not line-buffered when …Run Code Online (Sandbox Code Playgroud) 今天在我的采访中,采访者问:printf是一个函数,每个函数都返回一些东西; int,void,float等.现在printf返回什么,因为它是一个函数?
当连接到终端时,stdout是行缓冲的,但我记得在某处读取(至少从stdin)将自动刷新stdout.我使用的所有C实现都已经完成了,但我现在无法在标准中找到它.
它确实有意义,它是这样的,否则代码如下:
printf("Type some input: ");
fgets(line, sizeof line, stdin);
Run Code Online (Sandbox Code Playgroud)
需要一个额外的 fflush(stdout);
那么stdout肯定会在这里刷新吗?
编辑:
正如几个回复所说,标准中似乎无法保证我的示例中的stdout输出将在从stdin读取之前出现,但另一方面,这个意图在(我的免费草稿副本)中说明了标准:
交互设备的输入和输出动态应按照7.19.3的规定进行.这些要求的目的是尽快出现无缓冲或行缓冲输出,以确保在程序等待输入之前实际出现提示消息.
(ISO/IEC 9899:TC2委员会草案 - 2005年5月6日,第14页).
所以似乎没有保证,但无论如何它可能适用于大多数实现.(著名遗言...)
问题是关于linux如何处理堆栈.当我遇到运行此代码的分段错误时,为什么不确定?
#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>
void step(int n) {
printf("#%d\n", n);
step(n + 1);
}
int main() {
step(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在 Windows 上,使用 git bash 来运行我的 c 程序。
我使用 gcc 来编译代码。当我只做一个简单的事情时printf("hello, world");,它可以工作,但是当我尝试创建一个简单的程序来添加两个数字时,它什么也不做。
它可以编译,gcc -o sum sum.c但是当我使用它运行./sum它时,它什么也不做,但是当我在命令提示符中运行它时,它运行正常。
#include <stdio.h>
int main(void) {
int n1, n2;
printf("Enter a number: ");
scanf("%d", &n1);
printf("Enter another number: ");
scanf("%d", &n2);
int sum = n1 + n2;
printf("Sum: %d\n", sum);
}
Run Code Online (Sandbox Code Playgroud)
写入文件的一种方法是使用fprintf().但是,此函数不会立即将结果写入文件.当程序终止或完成时,它似乎立即写入所有内容.
我的问题如下:我有一个需要很长时间才能运行的程序(大数据集需要4-5个小时).在此期间,我希望看到中间结果,这样我就不必等待5个小时.我的大学Sun Grid Engine用于提交工作.正如大多数人所知,你必须等到你的工作完成才能看到你的最终结果.因此,我希望能够将中间结果写入文本文件,并在程序处理时查看更新的结果(类似地,如果我正在使用printf).
如何修改fprintf()以立即将任何我想要的内容写入目标文件?
我的 Windows 程序(使用 MSYS2 MINGW64 编译)stdout以大块输出其数据。使用aprintf()的调用\n无法正确刷新输出。
作为这个问题的变体,在什么条件下printf()不冲洗?
例如,以下代码在 MSYS2 MINGW64 上的块中输出:
#include <stdio.h>
int main() {
while(1) {
printf("test\n");
Sleep(1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 考虑以下计划.我想知道为什么这些代码以不同的方式表现.提前提前.
这不打印任何
#include <stdio.h>
int main() {
int i = 0;
while(i < 10) {
if(i < 7)
printf("value is%d", i++);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然这样做
#include <stdio.h>
int main() {
int i = 0;
while(i < 10) {
if(i < 7)
printf("value is%d\n", i++);
}
}
Run Code Online (Sandbox Code Playgroud) 我使用 C 的assert.h assert函数的方法与此类似:
int x = 3;\n\nif (x == 3)\n printf("x is 3 \xe2\x9c\x85");\n\nassert(x != 3);\nRun Code Online (Sandbox Code Playgroud)\n当运行它时,我发现该if语句被完全跳过,并且程序在到达该assert语句时终止。不用说,在我找到罪魁祸首之前,这在我的程序中造成了一些极其讨厌的错误。这可能是什么原因造成的?为什么条件被完全跳过?如果没有被跳过,那么为什么里面的代码没有被执行呢?我在这里设置了一个在线示例。
printf()C 中的函数\n最后是否需要 a才能工作?
我尝试打印出一个最后没有换行符的简单语句,但没有奏效。
谢谢。
#include <stdio.h>
int main(void) {
char str[50];
printf("Enter a string : ");
gets(str);
printf("You entered: %s", str);
return(0);
}
Run Code Online (Sandbox Code Playgroud)
我在 Eclipse 上运行代码,我希望得到以下结果:
Enter a string : abcde
You entered: abcde
Run Code Online (Sandbox Code Playgroud)
但是当我运行程序时,第一条打印语句没有出现在控制台中,并且在我输入任何字符串后,程序失败了。谁能告诉我为什么会这样?另外,你能告诉我如何修复我的代码以获得预期的结果吗?
尝试在变量之前和之后打印字符串.C是否有能力使用一个语句来显示此输出?
这有效:
float value = 5;
printf("\nThe value of %f", value);
printf(" is greater than zero.");
Run Code Online (Sandbox Code Playgroud)
这是愿望(一个声明):
float value = 5;
printf("\nThe value of %f", value, " is greater than zero.");
Run Code Online (Sandbox Code Playgroud)
(第二个字符串不显示)