linux中关于文件的open()函数、read()函数和write()函数的用法

open()函数:

`open()` 函数是一个 Linux 中非常常用的系统调用函数之一,它用于打开文件。其函数原型如下:

```c
#include <fcntl.h>
int open(const char* pathname, int flags);
int open(const char* pathname, int flags, mode_t mode);
```

其中,`pathname` 参数表示要打开的文件路径,可以是相对路径或绝对路径;`flags` 参数定义了打开文件的方式,可以是以下一或多个标志:

- `O_RDONLY`:只读方式打开;
- `O_WRONLY`:只写方式打开;
- `O_RDWR`:读写方式打开;
- `O_CREAT`:如果文件不存在就创建它;
- `O_EXCL`:与 `O_CREAT` 一起使用,要求文件不存在;
- `O_TRUNC`:如果文件已经存在,将其截断为空。

如果使用 `O_CREAT` 标志,则需要第三个参数 `mode`,表示新文件的权限。`mode` 参数是一个八进制数,利用文件访问权限的三个数位来设置文件权限,例如 `0644` 表示文件所有者有读写权限,其他用户只有读取权限。

`open()` 函数返回一个整型值,表示文件描述符。文件描述符是一个用于标识打开文件的整数值,应用程序可以使用该描述符执行读取、写入和其他操作。

举个例子,以下代码打开一个名为 `file.txt` 的文件:
 

```c
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    int fd = open("file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("open");
        exit(1);
    }

    write(fd, "hello, world!", 13);

    close(fd);

    return 0;
}
```


该程序使用 `O_WRONLY` 标志将文件以只写方式打开,如果文件不存在就创建,如果文件已经存在就截断为空。`0644` 表示文件权限,即文件所有者提供读写权限,其他用户只有读取权限。接下来,程序向文件中写入 "hello, world!",关闭文件描述符并结束程序。

read()函数:

在 Linux/Unix 操作系统中,`read()` 函数用于从文件描述符(包括普通文件、管道、socket 等)中读取数据。其函数原型如下:

```c
#include <unistd.h>

ssize_t read(int fd, void* buf, size_t count);
```

参数说明:

- `fd`:文件描述符,指向要读取数据的文件。
- `buf`:用于存储读取数据的缓冲区。
- `count`:要读取数据的字节数。

返回值:

- `0`:表示已经读到文件末尾。
- `-1`:表示读取失败,errno 指明了错误的类型。
- `>0`:表示实际读到的数据字节数。

例如,下面的代码片段演示了如何使用 `read()` 从标准输入中读取一行数据:
 

```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define MAXLINE 1024

int main(void) {
    char buf[MAXLINE];
    int n;

    while ((n = read(STDIN_FILENO, buf, MAXLINE)) > 0) {
        if (write(STDOUT_FILENO, buf, n) != n) {
            perror("write error");
            exit(1);
        }
    }

    if (n < 0) {
        perror("read error");
        exit(1);
    }

    return 0;
}
```


在这个例子中,我们使用 `read()` 函数从标准输入中读取数据,并将数据写入标准输出。当从标准输入中读取到文件末尾时,`read()` 函数将返回 `0`,表示已经读取完毕。需要注意的是,在实际的应用中,可能需要对读取的数据进行一定的处理和解析。

write()函数:

write()函数是一个UNIX系统调用,用于向已打开的文件描述符中写入数据。其函数原型如下:

```C
#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);
```

其中,fd为要写入数据的文件描述符,buf为要写入的数据的缓冲区指针,count为要写入的数据的字节数。函数返回值表示实际写入的字节数。如果返回-1,则表示写入失败,同时设置errno错误号。

下面是一个简单的使用write()函数向标准输出中写入数据的示例:
 

```C
#include <stdio.h>
#include <unistd.h>

int main()
{
    char *str = "hello world!\n";
    write(STDOUT_FILENO, str, strlen(str));
    return 0;
}
```



在上面的示例中,我们将一个字符串写入了标准输出中,也可以将其写入其他打开的数据流或文件中。需要注意的是,在写入数据时,需要确保文件描述符已经正确地打开,并且缓冲区指针指向的内存空间是有效的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值