相关疑难解决方法(0)

为什么stdout在重定向到文件时需要显式刷新?

行为printf()似乎取决于的位置stdout.

  1. 如果stdout发送到控制台,则printf()行缓冲并在打印换行符后刷新.
  2. 如果stdout被重定向到文件,则除非fflush()被调用,否则不刷新缓冲区.
  3. 此外,如果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)

c linux stdout

28
推荐指数
1
解决办法
1万
查看次数

printf返回什么?

今天在我的采访中,采访者问:printf是一个函数,每个函数都返回一些东西; int,void,float等.现在printf返回什么,因为它是一个函数?

c

19
推荐指数
2
解决办法
2万
查看次数

从stdin读取标准输出?

当连接到终端时,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页).

所以似乎没有保证,但无论如何它可能适用于大多数实现.(著名遗言...)

c stdin stdout flush

15
推荐指数
2
解决办法
4490
查看次数

如果我重复运行这个程序,为什么在seg-fault之前打印的最后一个数字会有所不同?

问题是关于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)

c linux stack operating-system segmentation-fault

7
推荐指数
1
解决办法
106
查看次数

如何在 Git bash 中运行 C 程序?

我在 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)

我尝试在 git bash 中输入值并得到与 cmd 相比的输出

c git-bash

6
推荐指数
1
解决办法
1万
查看次数

如何使fprintf()立即写入

写入文件的一种方法是使用fprintf().但是,此函数不会立即将结果写入文件.当程序终止或完成时,它似乎立即写入所有内容.

我的问题如下:我有一个需要很长时间才能运行的程序(大数据集需要4-5个小时).在此期间,我希望看到中间结果,这样我就不必等待5个小时.我的大学Sun Grid Engine用于提交工作.正如大多数人所知,你必须等到你的工作完成才能看到你的最终结果.因此,我希望能够将中间结果写入文本文件,并在程序处理时查看更新的结果(类似地,如果我正在使用printf).

如何修改fprintf()立即将任何我想要的内容写入目标文件?

c

3
推荐指数
1
解决办法
1499
查看次数

为什么带有 \n 的 printf() 在 Windows 上仍然无法刷新?

我的 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)

c windows flush mingw-w64 msys2

3
推荐指数
1
解决办法
1634
查看次数

if语句在内部,而依赖于依赖的同一个变量

考虑以下计划.我想知道为什么这些代码以不同的方式表现.提前提前.

这不打印任何

#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 conditional loops if-statement while-loop

2
推荐指数
1
解决办法
81
查看次数

为什么使用 C 的断言函数会跳过对其前面的条件的求值?

我使用 C 的assert.h assert函数的方法与此类似:

\n
int x = 3;\n\nif (x == 3)\n    printf("x is 3 \xe2\x9c\x85");\n\nassert(x != 3);\n
Run Code Online (Sandbox Code Playgroud)\n

当运行它时,我发现该if语句被完全跳过,并且程序在到达该assert语句时终止。不用说,在我找到罪魁祸首之前,这在我的程序中造成了一些极其讨厌的错误。这可能是什么原因造成的?为什么条件被完全跳过?如果没有被跳过,那么为什么里面的代码没有被执行呢?我在这里设置了一个在线示例。

\n

c

2
推荐指数
1
解决办法
79
查看次数

如果末尾没有 \n,则 Printf 不起作用

printf()C 中的函数\n最后是否需要 a才能工作?

我尝试打印出一个最后没有换行符的简单语句,但没有奏效。

谢谢。

c io printf newline

1
推荐指数
1
解决办法
75
查看次数

在 C 中一起使用 get() 和 printf() 会产生意想不到的结果

#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

0
推荐指数
1
解决办法
275
查看次数

可以在变量后输出字符串吗?(printf一行)

尝试在变量之前和之后打印字符串.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)

(第二个字符串不显示)

c printf output

-4
推荐指数
1
解决办法
165
查看次数