open()
函数
两个参数的版本:
#include <fcntl.h>
int open(const char *pathname, int flags);
pathname 是要打开的文件的路径。
flags 是一个或多个标志,用来指定文件的打开方式。
三个参数的版本:
#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);
pathname 是要打开的文件的路径。
flags 是一个或多个标志,用来指定文件的打开方式。
mode 是文件的权限模式,当创建新文件时使用。
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
// 打开一个文件用于读取
const char *filename = "example.txt";
int fd = open(filename, O_RDONLY);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// 假设我们知道文件大小为 100 字节
char buffer[100];
ssize_t bytes_read = read(fd, buffer, sizeof(buffer));
if (bytes_read == -1) {
perror("read");
close(fd);
exit(EXIT_FAILURE);
}
// 打印读取的数据
write(STDOUT_FILENO, buffer, bytes_read);
// 关闭文件描述符
close(fd);
return 0;
}
我们包含了 fcntl.h 头文件,这是使用 open() 函数所必需的。
我们尝试打开一个名为 example.txt 的文件用于只读访问(O_RDONLY)。
如果 open() 函数失败(返回 -1),我们使用 perror() 函数打印错误信息并退出程序。
我们定义了一个缓冲区 buffer 来存储从文件中读取的数据。
我们使用 read() 函数从文件描述符 fd 中读取数据到 buffer。
如果 read() 函数失败,我们打印错误信息,关闭文件描述符,并退出程序。
我们使用 write() 函数将读取的数据打印到标准输出。
最后,我们使用 close() 函数关闭文件描述符。
write/read ()函数:
函数的原型如下:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
fd 是一个文件描述符,它是一个整数,用于表示一个已经打开的文件。
buf 是一个指向数据缓冲区的指针,包含了要写入的数据。
count 是要写入的字节数。
函数返回写入的字节数,如果写入失败,它返回 -1。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main() {
const char *message = "Hello, World!\n";
int fd = STDOUT_FILENO; // 标准输出的文件描述符
size_t message_len = strlen(message) + 1; // 包括字符串结束符 '\0'
ssize_t bytes_written = write(fd, message, message_len);
if (bytes_written == -1) {
perror("write");
return 1;
}
printf("成功写入 %ld 字节\n", (long)bytes_written);
return 0;
}
- 我们包含了
unistd.h
头文件,这是使用write()
函数所必需的。 - 我们定义了一个字符串
message
,包含了要写入的内容。 - 我们使用
STDOUT_FILENO
宏来获取标准输出的文件描述符,这通常用于写入到控制台。 - 我们计算了消息的长度,包括字符串结束符
\0
。 - 我们调用
write()
函数来尝试写入消息。 - 如果
write()
函数返回-1
,我们使用perror()
函数打印错误信息。 - 如果写入成功,我们使用
printf()
函数打印写入的字节数。