1

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

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

此外,如果有人可以参考一些很好的阅读材料或教程来使用低级函数进行编程,那将有很大帮助。

4

2 回答 2

2

逐个字符地读取字符对性能不利。系统调用有点贵。大多数情况下,您需要某种缓冲区(分配的、静态内存、堆栈上的)。大小(一旦超过一定大小)并不那么重要。

如果您的 fd 0 是处于熟模式的终端,您将在每次调用 read 时获得一行(通常无法填充整个缓冲区)。重要的是要意识到一个读取 N 字节的请求不需要返回 N 字节,返回小于 N 字节也不需要意味着 IO 错误。如果它是基于磁盘的文件,那么您对缓冲区大小的读取请求往往会被完全填满。

Richard Stevens 的《Unix 环境中的高级编程》是一本很好的书。然后当然是系统调用的手册页。

于 2015-09-26T01:13:59.340 回答
1

stdin继续我之前的评论,阅读和写作与使用readandwrite和使用更高级别的函数(如fgetsand )之间几乎没有区别printf。主要区别是您不能依赖 variadic 提供的格式字符串printf,而使用read,您负责使用返回来了解实际读取了多少个字符。

下面是一个简短的示例,显示了从stdinwith读取输入read然后用write(注意:您应该添加额外的检查,例如检查读取的字符数是否小于缓冲区的大小以了解是否更多字符仍有待阅读等...)您始终可以将大部分提示read放入函数中以简化重复使用。

使用write,请记住,您写入内容的顺序stdout 格式字符串。因此,只需进行合乎逻辑的调用即可write完成您想要的格式。虽然您可以自由使用STDIN_FILENO定义,但您也可以简单地使用0 - stdin,1 - stdout2 - 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

输出

$ ./bin/read_write_stdin

 enter text  : The quick brown fox jumps over the lazy dog!

 text entered: The quick brown fox jumps over the lazy dog!
于 2015-09-26T06:13:30.873 回答