使用无缓冲的IO例程询问和读取用户输入

时间:2015-09-26 01:01:56

标签: c file-io low-level-io

我们刚开始使用C语言中的低级函数主题,对于此作业的一部分,我们必须要求用户输入。通常我会使用printf()和scanf()但是对于这个赋值,我们只允许使用read(),write(),open(),close()和lseek()。

我的问题是如何在打印到屏幕后从键盘读取输入? 我知道我必须使用read,文件描述符将是STDIN_FILENO,但是我如何确定大小计数?另外我如何跟踪用户输入的内容?我是否必须为此创建一个char数组?

此外,如果有人可以参考一些优秀的阅读材料或教程,使用低级功能进行编程,这将有很大帮助。

2 个答案:

答案 0 :(得分:2)

通过char读取char对性能有害。系统调用有点贵。通常,您需要某种缓冲区(malloced,静态内存,在堆栈上)。 尺寸(一旦超过一定的尺寸)并不重要。

如果您的fd 0是熟食模式的终端,您将在每次调用时获得一行(通常无法填满整个缓冲区)。重要的是要实现N个字节的读取请求不需要返回N个字节,并且小于N个字节的返回不需要表示IO错误。如果它是基于磁盘的文件,那么您对缓冲区大小的读取请求将倾向于完全填满。

理查德史蒂文斯在Unix环境中的高级编程是一本很好的书。 当然,系统的手册页调用。

答案 1 :(得分:1)

继续我之前的评论,使用stdinread阅读和写入write并使用更高级别的功能(如fgets和{{}之间几乎没有区别1}}。主要区别在于您不能依赖可变参数printf提供的格式字符串,而使用printf,您负责使用返回来了解实际读取的字符数。

以下是一个简短示例,其中显示了使用readstdin读取输入的基础知识,然后使用read注意:)将该信息写回来您应该添加的附加检查,例如检查读取的字符数是否小于缓冲区的大小,以确定是否还有更多字符要读取等等...)您可以随时提出大部分提示并write进入一个功能,以减少重复使用。

使用read时,请记住,您将内容写入write 的顺序是格式字符串。因此,只需对stdout进行逻辑调用即可完成所需的格式设置。虽然您可以自由使用write定义,但您也可以使用STDIN_FILENO0 - stdin1 - stdout

2 - stderr

<强>编译

#include <unistd.h>

#define MAXC 256

int main (void) {

    char buf[MAXC] = {0};
    ssize_t nchr = 0;

    /* write the prompt to stdout requesting input */
    write (1, "\n enter text  : ", sizeof ("\n enter text  : "));

    /* read up to MAXC characters from stdin */
    if ((nchr = read (0, buf, MAXC)) == -1) {
        write (2, "error: read failure.\n", sizeof ("error: read failure.\n"));
        return 1;
    }

    /* test if additional characters remain unread in stdin */
    if (nchr == MAXC && buf[nchr - 1] != '\n')
        write (2, "warning: additional chars remain unread.\n",
            sizeof ("warning: additional chars remain unread.\n"));

    /* write the contents of buf to stdout */
    write (1, "\n text entered: ", sizeof ("\n text entered: "));
    write (1, buf, nchr-1);
    write (1, "\n\n", sizeof ("\n\n"));

    return 0;
}

<强>输出

gcc -Wall -Wextra -o bin/read_write_stdin read_write_stdin.c