c - 在 C 中以最快的方式从标准输入读取
问题描述
我必须用 C 语言编写一个程序,在该程序中我必须从中读取一些值,stdin
并且还要使用 C 语言中最快的函数来完成它。它以如下stdin
形式预加载:
int,int\n
char\n
int,int,int\n ex...
我正在寻求帮助,因为scanf
对于项目的时间要求来说太慢了,也因为我在阅读时遇到了一些困难,因为','
我并不真正需要,这给我带来了问题。我试过gets
or getchar
,但我没能成功。
解决方案
最快的读取方式stdin
(“标准输入” - 0 文件描述符)是使用以下read
函数<unistd.h.>
:
char buff[1024] = {0}; /* zero-initialize */
ssize_t res = read(0, &buff, sizeof(buff));
/* res is amount of bytes read; -1 if error */
这是一个程序示例,它读取 1024 字节的标准输入并将其回显到标准输出(文件描述符:1)(为简单起见,没有错误处理):
#include <unistd.h>
#define BUFSIZ 1024
int main() {
char buff[BUFSIZ] = {0}; /* zero-initialize */
ssize_t nread = read(0, buff, BUFSIZ);
/* pass amount of bytes read as a byte amount to write */
write(1, buff, nread);
return 0;
}
这是从标准输入读取的最快方法,因为它是内核系统调用read
的本机包装器。libc
顺便说一句,您可以使用-O3
, 甚至-Ofast
编译器选项来优化代码。
另外,请记住,read
并且write
不能保证读取/写入的字节数与您想要的一样多,您应该像这样在循环中调用它:
size_t to_write = sizeof(buff); /* example, can be result of read() */
int fd = 1;
size_t nwrote = 0;
while ((nwrote += write(1, buff, to_write) < to_write) {
/* pointer arithmetic to create offset from buff start */
write(fd, buff+nwrote, to_write - nwrote);
}
推荐阅读
- docker - 提名码头工人 - 身份验证?
- c# - 在gridview中显示总文本框更改事件
- java - 如何在 Spring Boot 中为付款请求生成 JWT 令牌?
- python - 从一列拆分字符串并在python中创建一个新列
- linux - 如何使用包含 grep 和引号的 ssh -t 命令
- java - Java接口&
- c# - 如何使用 redis 作为二级索引提供排序功能
- html - Div 不正确
- c++ - gdb(MinGW)不会因断言失败而中断(VSCode 配置)
- java - 请解释一下apache camel中concurrentConsumers和spring.activemq.pool.max-connections的用法的区别