文件操作系列函数详解+代码展示

系列文章目录

🎈 🎈 我的CSDN主页 :OTWOL的主页,欢迎!!!👋🏼👋🏼

🎉🎉我的C语言初阶合集C语言初阶合集,希望能帮到你!!!😍 😍

🔍🔍我的C语言进阶合集我的C语言进阶合集,期待你的点击!!!🌈🌈

文章目录


前言

各位博友,大家好!👋 今天我为大家总结C语言中的文件操作📁。
文件操作是编程中的重要部分,它允许我们读写存储在磁盘上的数据。
我将详细介绍文件打开、读写、关闭等基本操作,
以及一些注意事项,助你轻松掌握文件处理技巧!📝


一、 文件打开

在C语言中,文件操作是通过标准库函数来实现的。
首先,我们需要包含头文件<stdio.h>

  • 函数原型
bash 复制代码
FILE *fopen(const char *filename, const char *mode);

filename:要打开的文件名(包括路径)。
mode:打开文件的模式,如读、写、追加等。

  • 常见的模式
模式(mode) 含义
r 只读模式,文件必须存在。
w 只写模式,文件不存在则创建,存在则清空。
a 追加模式,文件不存在则创建,存在则在文件末尾追加数据。
r+ 读写模式,文件必须存在。
w+ 读写模式,文件不存在则创建,存在则清空。
a+ 读写模式,文件不存在则创建,存在则在文件末尾追加数据,但可以读取文件。
  • 示例:
c 复制代码
#include <stdio.h>

int main()
{
    // 尝试以写入模式打开名为 "test.txt" 的文件
    FILE* pf = fopen("test.txt", "w");
    // 如果文件打开失败,pf 将等于 NULL
    if (pf == NULL)
    {
        // 使用 perror 打印错误信息,"fopen"是错误信息的前缀
        perror("fopen");
        // 返回 非零值表示程序异常退出
        return 1;
    }

    // 关闭文件,释放资源
    fclose(pf);
    // 将 pf 设置为 NULL,避免野指针问题
    pf = NULL;

    // 返回 0 表示程序正常退出
    return 0;
}

二、 文件关闭

  • 函数原型
bash 复制代码
int fclose(FILE *stream);

fclose:关闭文件,释放资源。

  • 示例:
c 复制代码
#include <stdio.h>

int main()
{
    // 尝试以读取模式打开名为"test.txt"的文件
    FILE* pf = fopen("test.txt", "r");
    // 如果文件打开失败, pf 将等于 NULL
    if (pf == NULL)
    {
        // 使用 perror 打印错误信息, "fopen" 是错误信息的前缀
        perror("fopen");
        // 返回非零值表示程序异常退出
        return 1;
    }

    // 关闭文件,释放资源
    fclose(pf);
    // 将 pf 设置为 NULL,避免野指针问题
    pf = NULL;

    // 返回 0 表示程序正常退出
    return 0;
}

三、文件读写

写文件

  • 函数原型
c 复制代码
int fputc(int c, FILE* stream);
int fputs(const char* str, FILE* stream);
int fprintf(FILE* stream, const char* format, ...);
size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);

fputc:写入单个字符。
fputs:写入字符串。
fprintf:格式化写入,类似于printf
fwrite:写入二进制数据。

  • 示例:
c 复制代码
#include <stdio.h>

int main() 
{
    // 尝试以写入模式打开名为"test.txt"的文件
    FILE* pf = fopen("test.txt", "w");
    // 如果文件打开失败,pf 将等于 NULL
    if (pf == NULL) 
    {
        // 使用 perror 打印错误信息,"fopen"是错误信息的前缀
        perror("fopen");
        // 返回非零值表示程序异常退出
        return 1;
    }
    // 使用 fputs 函数将字符串"Hello, World!\n"写入文件
    fputs("Hello, World!\n", pf);
    // 使用 fprintf 函数将格式化的字符串和数字 66 写入文件
    fprintf(pf, "Number: %d\n", 66);

    // 关闭文件,释放资源
    fclose(pf);
    // 将 pf 设置为 NULL,避免野指针问题
    pf = NULL;

    // 返回 0 表示程序正常退出
    return 0;
}

读文件

  • 函数原型
c 复制代码
int fgetc(FILE* stream);
char* fgets(char* str, int n, FILE* stream);
int fscanf(FILE* stream, const char* format, ...);
size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream);

fgetc:读取单个字符。
fgets:读取字符串。
fscanf:格式化读取,类似于scanf
fread:读取二进制数据。

  • 示例:
c 复制代码
#include <stdio.h>

int main() 
{
    char buf[20]; // 定义一个字符数组,用于存储从文件中读取的每一行
    int n;        // 定义一个整数变量,用于存储从文件中读取的整数
    FILE* pf = fopen("test.txt", "r"); // 尝试以读取模式打开名为"test.txt"的文件
    if (pf == NULL) // 如果文件打开失败, pf 将等于 NULL
    {
        perror("fopen"); // 使用 perror 打印错误信息,"fopen"是错误信息的前缀
        return 1; // 返回非零值表示程序异常退出
    }
    // 使用 fgets 循环读取文件的每一行,直到到达文件末尾
    while (fgets(buf, sizeof(buf), pf) != NULL)
    {
        printf("%s", buf); // 打印读取的每一行
    }
    rewind(pf); // 将文件指针重新定位到文件开头,以便重新读取文件
    fscanf(pf, "n: %d", &n); // 从文件中读取格式化的整数,假设格式为 "n: 数字"
    printf("n: %d\n", n); // 打印读取的整数

    fclose(pf); // 关闭文件,释放资源
    pf = NULL; // 将 pf 设置为 NULL,避免野指针问题

    return 0; // 返回 0 表示程序正常退出
}

四、注意事项

1、检查返回值:

文件操作函数(如fopenfclosefreadfwrite等),
通常都有返回值,用于指示操作是否成功。
务必检查这些返回值。

2、文件指针:

文件操作依赖于文件指针(FILE *),
确保文件指针在使用前已经正确初始化,
并在使用后正确关闭。

3、缓冲区:

使用fgetsfputs等函数时,要注意缓冲区的大小,避免缓冲区溢出。

4、文件模式:

选择正确的文件模式非常重要,特别是写模式和追加模式,
它们的行为是不同的。

5、错误处理:

使用perrorstrerror等函数来处理文件操作中的错误,
提供有用的错误信息。

6、二进制文件:

对于二进制文件,使用freadfwrite进行读写,
避免使用文本模式函数(如fgetsfputs)。


END

每天都在学习的路上!
On The Way Of Learning

相关推荐
算AI14 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
我不会编程55514 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
李少兄14 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
懒羊羊大王&15 小时前
模版进阶(沉淀中)
c++
无名之逆15 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
似水এ᭄往昔15 小时前
【C语言】文件操作
c语言·开发语言
啊喜拔牙15 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
owde15 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
xixixin_15 小时前
为什么 js 对象中引用本地图片需要写 require 或 import
开发语言·前端·javascript
GalaxyPokemon16 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++