标签: stdio

如何在C中读取/解析输入?常见问题

当我尝试读取/解析输入时,我的C程序出现问题.

救命?


这是一个FAQ条目.

StackOverflow有许多与C中读取输入相关的问题,答案通常集中在特定用户的特定问题上,而不是真正描绘整个画面.

这是一次全面覆盖一些常见错误的尝试,因此只需将这些错误标记为重复,就可以回答这一特定问题:

  • 为什么最后一行打印两次?
  • 为什么我scanf("%d", ...)/ scanf("%c", ...)失败?
  • 为什么会gets()崩溃?
  • ...

答案被标记为社区维基.随意改进和(谨慎)扩展.

c stdio

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

#include <stdio.h>在ac程序中真的做了什么

我是c编程的新手,我编写了一些简单的程序"Hello world"风格.

在所有这些程序中,我放在#include<stdio.h>顶部,但我不确定这究竟是什么意思.我用谷歌搜索它,我发现stdio.h是一个具有预处理器命令的文件,但什么是预处理器?我想当我编写代码时,我编译它并且我的代码转换为"计算机"可以读取的形式然后我可以运行它.有人可以向我解释这个命令的用法是什么吗?

c stdio include

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

没有"-std = c99"的大规模fprintf速度差异

我写过一本表现不佳的翻译,几周来一直在苦苦挣扎.在下面简单的bechmark

#include<stdio.h>

int main()
{
    int x;
    char buf[2048];
    FILE *test = fopen("test.out", "wb");
    setvbuf(test, buf, _IOFBF, sizeof buf);
    for(x=0;x<1024*1024; x++)
        fprintf(test, "%04d", x);
    fclose(test);
    return 0
}
Run Code Online (Sandbox Code Playgroud)

我们看到以下结果

bash-3.1$ gcc -O2 -static test.c -o test
bash-3.1$ time ./test

real    0m0.334s
user    0m0.015s
sys     0m0.016s
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在添加"-std = c99"标志的那一刻,性能崩溃了:

bash-3.1$ gcc -O2 -static -std=c99 test.c -o test
bash-3.1$ time ./test

real    0m2.477s
user    0m0.015s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

我正在使用的编译器是gcc 4.6.2 mingw32.

生成的文件大约是12M,所以这两者之间的差异大约为21MB/s.

运行diff显示生成的文件是相同的.

我认为这与文件锁定有关fprintf,程序大量使用,但我无法找到在C99版本中关闭它的方法.

我尝试flockfile了在程序开始时使用的流,并funlockfile在最后使用了相应的流,但是遇到了关于隐式声明的编译器错误,以及声称对这些函数的未定义引用的链接器错误. …

c performance locking stdio mingw32

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

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

fprintf是否在引擎盖下使用malloc()?

我想要一个最小的o-damn-malloc-just-failed处理程序,它将一些信息写入文件(可能只是标准错误).我更喜欢使用fprintf()而不是write(),但如果fprintf()本身尝试使用malloc(),则会失败.

是否有一些保证,无论是在C标准,还是只是在glibc,fprintf不会这样做?

c malloc printf stdio

17
推荐指数
2
解决办法
7027
查看次数

关闭FILE指针而不关闭基础文件描述符

通过使用fdopen(),fileno()可以使用现有文件描述符打开流.然而,正确的方法关闭文件,一旦你与流打开它要fclose()FILE指针.如何关闭流,但保留打开的文件描述符?

此行为类似于调用fflush()然后再次fileno()使用FILE指针,除非在关闭时.另一个问题是,如果你fdopen()再次,现在有多个FILE指针,你只能关闭其中一个.

c file stdio stream libc

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

使用scanf()读取一行不好?

scanf(" %[^\n]",line);
Run Code Online (Sandbox Code Playgroud)

我的一个朋友建议使用fgets()读取一行作为输入比使用scanf()上面的声明更好.他有道理吗?

c scanf stdio

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

stdio.h在C++中不是标准的?

我知道大多数编译器都允许:

#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)

//和

#include <cstdio>
Run Code Online (Sandbox Code Playgroud)

但有人认为<stdio.h>实际上并不是C++标准.

真的吗?

c++ stdio standard-library

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

使用NDK捕获stdout/stderr

我正在移植一些现有的C代码以在Android上运行.此C代码将大量输出写入stdout/stderr.我需要在内存缓冲区或文件中捕获此输出,以便我可以通过电子邮件或其他方式共享它.

如何在不修改现有C代码的情况下实现这一目标?

注意:这个问题不是关于将输出重定向到adb或logcat; 我需要在设备上本地缓冲输出.我知道以下问题,但似乎没有解决我的问题:

c android stdout stdio android-ndk

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

Java:如何中止从System.in读取的线程

我有一个Java线程:

class MyThread extends Thread {
  @Override
  public void run() {
    BufferedReader stdin =
        new BufferedReader(new InputStreamReader(System.in));
    String msg;
    try {
      while ((msg = stdin.readLine()) != null) {
        System.out.println("Got: " + msg);
      }
      System.out.println("Aborted.");
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

}

在另一个线程中,如何stdin.readline()在此线程中中止调用,以便打印此线程Aborted.?我试过了System.in.close(),但这没有任何区别,stdin.readline()仍然是阻塞.

我对没有的解决方案感兴趣

  • 忙等待(因为这会烧掉100%的CPU);
  • 睡觉(因为那时程序没有立即响应System.in).

java stdio

14
推荐指数
2
解决办法
9422
查看次数