标签: stdio

C fgets与fgetc的阅读线

我需要读取一行文本(由换行符终止),而不对长度做出假设.所以我现在面对各种可能性:

  • fgets每次使用并检查最后一个字符是否为换行符并连续附加到缓冲区
  • 使用fgetc偶尔realloc使用缓冲区读取每个字符

Intuition告诉我fgetc变体可能会变慢,但是我再也看不出如何fgets在不检查每个角色的情况下做到这一点(我的直觉也不总是那么好).线条非常大,因此性能很重要.

我想知道每种方法的优缺点.先感谢您.

c io stdio fgets fgetc

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

命令末尾的"</ dev/null>&/ dev/null"是做什么的?

我在ssh上运行的一个脚本正在挂起,我在这个站点找到了一个解决方案:http: //www.snailbook.com/faq/background-jobs.auto.html

该站点通过将此添加到命令的末尾来解决问题:

xterm < /dev/null >& /dev/null &
Run Code Online (Sandbox Code Playgroud)

我想我知道它的作用是什么,但有人能帮忙解释一下吗?

第一部分:

# For stdin, read from /dev/null
< /dev/null
Run Code Online (Sandbox Code Playgroud)

第二部分:

>& /dev/null
Run Code Online (Sandbox Code Playgroud)

怎么>&办?我已经看到2>&1哪个是直接STDERR到STDOUT,但是当没有数字时,这是否意味着将所有内容重定向到/dev/null

linux bash stdio

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

是否为明确定义的相同文件描述符创建了两个FILE?

POSIX指定了一个fdopen函数,它FILE为文件描述符创建一个.POSIX还指定了一个fileno函数,该函数返回a的文件描述符FILE.总之,这两个可以用于创建第二个FILE访问与现有文件相同的底层文件描述符:

FILE *secondfile(FILE *f, const char *mode)
{
    int fd = fileno(f);

    return fd >= 0 ? fdopen(fd, mode) : NULL;
}
Run Code Online (Sandbox Code Playgroud)

这是POSIX下定义明确的操作吗?当我访问同一个文件描述符的原始FILE和第二个时,会发生什么FILE?是否指定了交互?如果有,怎么样?

从历史上看,Unices FILE为您打开的20个文件使用了固定的结构表.调用fdopen()已经与a关联的文件描述符FILE会因此破坏现有文件并产生未定义的行为.我不确定stdioPOSIX是否仍然允许这样的实现,这就是我提出这个问题的原因.

c posix file-descriptor stdio language-lawyer

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

动态获取另一个程序的输出作为输入

我有两个以这种方式使用的程序:

$ c_program | python_program.py
Run Code Online (Sandbox Code Playgroud)

c_program使用printf()和python_program.py读取打印的东西sys.stdin.readline()

我想立即打印python_program.py进程c_program的输出,以便它可以打印自己的当前输出.不幸的是,python_program.py仅在c_program结束后获取其输入.

我怎么解决这个问题?

c python linux bash stdio

10
推荐指数
3
解决办法
7288
查看次数

强制程序在重定向时刷新其标准输出

我有一个封闭的源程序,打印输出到标准输出.我需要解析输出.所以我使用dup2将输出重定向到fifo(我可以在父进程中读取,分叉和执行二进制文件),然后执行程序.问题是文件中的fprintf调用变为缓冲,因为它现在正在写入文件.

我试着在调用exec之前在stdout上用_IONBF调用setvbuf.但问题仍然存在.

为什么setvbuf在我的情况下没有帮助?

我如何强制输出刷新?

c linux stdio fifo

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

Java + Eclipse:同步stdout和stderr

我用Eclipse.当我有这样的应用程序时:

write 20 times 'Hello World\n' to stdout
write 'ERROR\n' to stderr
write 5 times 'Hello  World\n' to stdout
Run Code Online (Sandbox Code Playgroud)

输出看起来很多次像这样:

Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
...
Hello World
Hello World
Hello World
ERROR
Run Code Online (Sandbox Code Playgroud)

有没有办法同步这两个输出流?当然,在20次块之后Hello World等待几毫秒并且在打印之后等待几毫秒ERROR.

java eclipse synchronization stdio

10
推荐指数
3
解决办法
3024
查看次数

检查进程是否作为管道运行

我有一个小的Python实用程序,它应该只作为管道运行.我希望它在单独运行时打印出帮助消息.一个过程如何知道它是否被用作管道.比较sys.stdinsys.__stdin__不起作用.

python pipe process stdio

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

stdio总是设置errno吗?

stdio流遇到错误(但不是EOF)时,将设置流的错误指示符,以便ferror()返回非零值.我一直认为可以获得更多信息errno.但我怎么知道这个?

某些功能的文档[例如man fopen在Linux下]说明errno也将设置.但是man fgets根本没有提到errno.glibc信息页面令人放心:

除了设置与所述流相关联的错误指示符,该上流进行操作的功能也以同样的方式作为上文件描述符操作相应的低级别的功能设置`错误号".

但我不知道这种保证有多强.它是否需要C标准?Visual C/C++会发生什么?

c c++ error-handling stdio errno

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

防止包含stdio.h(或其他标准头文件)

我使用的代码库历史上曾经有意地试图避免依赖于stdio.h爬行.它有自己的打印格式和机制,那些应该用来代替printf等.

但是有人经常会添加一个依赖项,必须引起注意并被删除.所以我试着为最简单的情况发出警报:

#if !defined(NDEBUG)
   void printf(float dont_link_with_stdio_h);
#endif
Run Code Online (Sandbox Code Playgroud)

gcc人员似乎一直在思考如何阻止容易出错,因为如果你这样做有一个有用的信息......无论你是否包括在内<stdio.h>.

内置函数'printf'的冲突类型

有一种方法可以关闭此警告(-fno-builtin).并且有各种各样的方法可以做一些事情,例如过滤掉你不想去的东西的符号转储......

但有没有一个简单的非警告(如果你没有包括stdio.h)的方式提醒某人他们已经引入了不需要的printf用法?

c stdio

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

是snprintf(NULL,0,...); 行为标准化?

在Linux上,它返回将要打印的字符数.

这是标准化的行为吗?

c standards stdio

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