首页 > 解决方案 > 在 C 中以最快的方式从标准输入读取

问题描述

我必须用 C 语言编写一个程序,在该程序中我必须从中读取一些值,stdin并且还要使用 C 语言中最快的函数来完成它。它以如下stdin形式预加载:

int,int\n
char\n
int,int,int\n ex...  

我正在寻求帮助,因为scanf对于项目的时间要求来说太慢了,也因为我在阅读时遇到了一些困难,因为','我并不真正需要,这给我带来了问题。我试过getsor getchar,但我没能成功。

标签: c

解决方案


最快的读取方式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);
}

推荐阅读