热门问题
时间线
聊天
视角

写入

来自维基百科,自由的百科全书

Remove ads

写入(write)是由类Unix操作系统内核提供的最为基本的程序。此程序从用户定义的缓冲中将数据写入设备或文件,这也是从程序中使用系统调用直接输出数据的主要方式。待写入的地点由文件描述符定义;要写入的数据(如文本)由指针和大小(字节数)定义。

write也因此需要三个参数:

  1. 文件代码(文件描述符fd)
  2. 指向文件存储地的缓冲的指针(buf);
  3. 要从缓冲中写入的字节数(nbytes)。

POSIX用法

写入调用接口[1][2]根据POSIX规范定义。通过调用写入函数,数据才能写入文件。此函数的原型为:

 ssize_t write(int fd, const void *buf, size_t nbytes);
更多信息 参数, 描述 ...

在上述语法中,ssize_t是一个typedef(定义于stddef.h中带符号的数据类型)。但注意write()会在发生错误的时候返回-1(参见下方的错误一节),故其一定会返回带符号的值。 写入函数将返回成功写入数组的字节数,即意味着有时此值将小于指定的nbytes

使用示例

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main_gg (int argc, char *argv[])
{
    int fd1;
    char buf[128];
    fd1 = open(argv[1], O_WRONLY);
    if (fd1 == -1) {
        perror(argv[1]);
        return EXIT_FAILURE;
    }

    /* 输入待写入至文件的数据 */
    scanf("%127s", buf);

    write(fd1, buf, strlen(buf)); /* fd1为文件描述符,buf为用于存储数据的字符阵列,strlen(buf)用于通知函数缓冲中需要复制的字符串字节长度 */

    close(fd1);

    return 0;
}
Remove ads

操作错误

下方列出的是在写入文件时可能会发生的错误[3][4]。这些错误为errno.h中列出的宏命令。

更多信息 错误数字, 错误 ...

调用写入的高级I/O函数

虽然看起来很像,但写入系统调用不是一个普通的函数。例如在x86架构上的Linux系统上,此系统调用会使用INT 80H指令以将控制权转移给内核。[5]写入系统调用,及其配对函数读取(read)均是只能理解字节的低级函数。写入函数不可用于写入记录(如)。因此,此时通常需要高级的输入输出函数(如printf)。通常与混乱的低级接口相比,程序员更偏好使用高级接口。这些函数在内部调用其他函数,反之也可做出写入调用,进而打造出了分层函数组合。[6]

有了这种组合,高级函数可收集数据的字节并随后写入文件。

Thumb
调用写入的高级I/O函数

参见

  • fwrite
  • getchar
  • fprintf
  • pwrite ()
  • read (system call)
  • sync (Unix)

参考文献

外部链接

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads