自学内容网 自学内容网

(C语言) 文件读写基础

🗂️前言

📄ref

📄访问标记

🗃️文件访问标记

文件访问 模式字符串含义解释若文件已存在的动作若文件不存在的动作
“r”打开文件以读取从头读打开失败
“w”创建文件以写入销毁内容创建新文件
“a”后附后附到文件写到结尾创建新文件
“r+”读扩展打开文件以读/写从头读错误
“w+”写扩展创建文件以读/写销毁内容创建新文件
“a+”后附扩展打开文件以读/写写到结尾创建新文件
  • 可以可选地指定文件访问模式标记 “b” 来以二进制模式打开文件。此标在 POSIX 上没有效果,而在 Windows 系统上,它禁用了对 ‘\n’ 和 ‘\x1A’ 特殊处理。 在附加文件访问模式下,数据被写入到文件尾,而不考虑文件位置指示器的当前位置。
  • 如果模式不是以上所列字符串之一,则其行为未定义。一些实现会定义额外支持的模式(比如 Windows)。
  • 在更新模式('+')中,输入和输出均可进行,然而输出不应直接紧随输入,而中间无对 fflushfseekfsetposrewind 的调用,且输入不应直接紧随输出,而中间无对 fseekfsetposrewind 的调用,除非输入操作遇到文件尾。在更新模式中,允许各实现在即便指定了文本模式时仍使用二进制模式。
  • 文件访问模式标记 “x” 可以可选地后附于 “w” 或 “w+” 指定符。若文件存在,则此标记强制函数失败,而不重写它。(C11)
  • 使用 fopen_s 或 freopen_s 时,任何以 “w” 或 “a” 创建的文件的文件访问许可均禁止其他用户访问它。文件访问模式标签 "u" 可以可选地前附于任何以 “w” 或 “a” 开始的指定符,以启用默认的 fopen 许可。(C11)

🗂️Code

📄demo

#include <stdio.h>
#include <stdlib.h>

void file_write(const char* file_path) {
    FILE* fp = fopen(file_path, "w+");
    if (NULL == fp) {
        return;
    }

    fputs("cuber-lotus", fp);
    fputc('\n', fp);
    fputc('u', fp);
    fputc('r', fp);
    fputc('l', fp);
    fputc(':', fp);
    fprintf(fp, "https://space.bilibili.com/8172252");

    if (ferror(fp)) {
        perror("Error I/O.");
    }

    fclose(fp);
}

void file_read(const char* file_path) {
    FILE* fp = fopen(file_path, "r+");
    if (NULL == fp) {
        return;
    }

#if 1
    // 按行读
    char buf[1024] = {};
    while (feof(fp) == 0) {
        fgets(buf, sizeof(buf), fp);
        printf("%s", buf);
    }
#else
    // 按字符读
    int c;
    while ((c = fgetc(fp)) != EOF) {
        putchar(c);
    }
#endif

    puts("");
    if (ferror(fp)) {
        perror("Error I/O.");
    } else if (feof(fp)) {
        puts("fp is EOF.");
    } else {
        puts("fp is not EOF.");
    }

    fclose(fp);
}

int main() {
    const char* file_path = "example.txt";
    file_write(file_path);
    file_read(file_path);
}

📄分点讲解

注意,所有操作都有多种api,比如关于print组函数可见:(C语言) print输出函数系列介绍

其实文件就是一种特殊的,如果对流的概念和操作熟悉,那么对文件的读写想必也会很很难。

🗃️打开/关闭

注意:千万必要复制FILE对象,该行为是未定义的。

FILE* fp = fopen(file_path, "w+");
fclose(fp);

🗃️写

// 写入char*
fputs("cuber-lotus", fp);
// 写入单个字符
fputc(':', fp);
// 写入char*
fprintf(fp, "https://space.bilibili.com/8172252");

🗃️读

法1:

// 按行读
char buf[1024] = {};
while (feof(fp) == 0) {
    fgets(buf, sizeof(buf), fp);
    printf("%s", buf);
}

法2:

// 按字符读
int c;
while ((c = fgetc(fp)) != EOF) {
    putchar(c);
}



🗂️END

🌟关注我

关注我,学习更多C/C++,算法,计算机知识

B站:

👨‍💻主页:天赐细莲 bilibili


原文地址:https://blog.csdn.net/CUBE_lotus/article/details/140621268

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!