文件操作(open与fopen,write与fwrite,read与fread)

2023-12-20 22:02:13

open与fopen

fopen函数是标准I/O库函数的一部分,它提供了更高级别的文件操作功能,例如缓冲、格式化输入输出等。而open函数直接与底层文件系统交互,提供了更底层的文件操作。linux下的fopen是open的封装函数,fopen最终还是要调用底层的系统调用open。选择使用open还是fopen取决于你的需求和使用环境。如果你需要更底层的文件操作或者在特定的系统调用接口上工作,可以选择使用open函数。如果你更倾向于使用标准C库函数以及提供的高级别文件操作功能,可以选择使用fopen函数。

open函数

open函数是一个在C语言中用于打开文件的系统调用函数。它提供了对文件的创建、打开和访问的功能。open函数的原型如下,可以指定打开方式和权限:

#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

成功时,返回一个非负整数文件描述符,表示打开的文件;失败时,返回-1,并设置errno来指示错误类型。举例,以追加模式写入,权限为777:

int fd = open(filename, O_CREAT | O_WRONLY | O_APPEND, 0777);

关于详细的权限操作,可以参考https://fakerth.blog.csdn.net/article/details/135055061
open对应的文件操作有:close,read,write等,使用open进行一个简单的读写如下。

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

int main() {
    const char* filename = "example.txt";
    const char* content = "Hello, World!";
    size_t content_size = strlen(content);

    // 打开文件以写入模式
    int fd = open(filename, O_CREAT | O_WRONLY, 0666);
    if (fd == -1) {
        perror("Failed to open or create file");
        return 1;
    }

    // 写入内容到文件
    ssize_t bytes_written = write(fd, content, content_size);
    if (bytes_written == -1) {
        perror("Failed to write to file");
        close(fd);
        return 1;
    }

    // 关闭文件
    close(fd);

    // 重新打开文件以读取模式
    fd = open(filename, O_RDONLY);
    if (fd == -1) {
        perror("Failed to open file for reading");
        return 1;
    }

    // 分配缓冲区来存储读取的内容
    char* buffer = (char*)malloc(content_size + 1);
    if (buffer == NULL) {
        perror("Failed to allocate buffer");
        close(fd);
        return 1;
    }

    // 读取文件内容到缓冲区
    ssize_t bytes_read = read(fd, buffer, content_size);
    if (bytes_read == -1) {
        perror("Failed to read from file");
        close(fd);
        free(buffer);
        return 1;
    }

    // 添加字符串结束符
    buffer[content_size] = '\0';

    // 输出读取的内容
    printf("File content: %s\n", buffer);

    // 关闭文件和释放资源
    close(fd);
    free(buffer);

    return 0;
}

fopen函数

fopen函数是C标准库中的文件操作函数,用于打开文件并返回一个指向FILE结构的指针,以便进行后续文件操作。

#include <stdio.h>

FILE* fopen(const char* filename, const char* mode);

其中mode为打开文件的模式,是一个字符串参数,用于指定文件的访问模式和操作类型。常用的模式包括:

  • “r”:只读方式打开文件。
  • “w”:只写方式打开文件,如果文件存在则截断为零长度,如果文件不存在则创建文件。
  • “a”:追加写入方式打开文件,如果文件不存在则创建文件。
  • “r+”:读写方式打开文件。
  • “w+”:读写方式打开文件,如果文件存在则截断为零长度,如果文件不存在则创建文件。
  • “a+”:读写方式打开文件,追加写入到文件末尾,如果文件不存在则创建文件。
    成功时,返回一个指向FILE结构的指针,表示打开的文件;失败时,返回NULL,表示打开文件失败。
    fopen对应的文件操作有:fclose,fread,fwrite等,使用fopen进行一个简单的读写如下。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    const char* filename = "example.txt";
    const char* content = "Hello, World!";
    size_t content_size = strlen(content);

    // 打开文件以写入模式
    FILE* file = fopen(filename, "w");
    if (file == NULL) {
        perror("Failed to open or create file");
        return 1;
    }

    // 写入内容到文件
    size_t bytes_written = fwrite(content, sizeof(char), content_size, file);
    if (bytes_written != content_size) {
        perror("Failed to write to file");
        fclose(file);
        return 1;
    }

    // 关闭文件
    fclose(file);

    // 重新打开文件以读取模式
    file = fopen(filename, "r");
    if (file == NULL) {
        perror("Failed to open file for reading");
        return 1;
    }

    // 分配缓冲区来存储读取的内容
    char* buffer = (char*)malloc(content_size + 1);
    if (buffer == NULL) {
        perror("Failed to allocate buffer");
        fclose(file);
        return 1;
    }

    // 读取文件内容到缓冲区
    size_t bytes_read = fread(buffer, sizeof(char), content_size, file);
    if (bytes_read != content_size) {
        perror("Failed to read from file");
        fclose(file);
        free(buffer);
        return 1;
    }

    // 添加字符串结束符
    buffer[content_size] = '\0';

    // 输出读取的内容
    printf("File content: %s\n", buffer);

    // 关闭文件和释放资源
    fclose(file);
    free(buffer);

    return 0;
}

运行

在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_43912621/article/details/135116455
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。