侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

C语言学习小记(15)-文件操作

zze
zze
2024-04-15 / 0 评论 / 0 点赞 / 15 阅读 / 6824 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

文件概述

在C语言中,文件被视为一个字节序列的抽象,可以存储文本、二进制数据或混合数据。文件操作是通过标准库提供的文件处理函数来完成的,这些函数主要集中在stdio.h头文件中。

文件类型

  1. 文本文件:包含可读字符序列,操作系统通常会在内部转换为特定的字符编码(如ASCII、UTF-8)。在C语言中,通过标准输入输出流(如stdin、stdout)或以文本模式打开的文件流处理此类文件。

  2. 二进制文件:包含原始字节序列,不做任何字符编码转换。处理二进制文件时,通常使用以二进制模式打开的文件流。

文件操作流程

  1. 打开文件

使用fopen函数打开一个文件,返回一个指向FILE结构体的指针(称为文件指针),用于后续文件操作。示例:

FILE *fp;
fp = fopen("example.txt", "r");  // 打开名为example.txt的文件以只读方式("r")打开

打开模式还包括:"w"(写入,如果文件已存在则清空内容)、"a"(追加,如果文件不存在则创建)、"r+"(读写,文件必须存在)、"w+"(读写,如果文件已存在则清空内容)、"a+"(读写,如果文件不存在则创建)。

  1. 读写文件

根据文件指针进行文件内容的读取或写入。常用函数包括:

  • 读取

    • fscanf:从文件中按格式读取数据,类似于 scanf

    • fgets:读取一行文本,包括换行符。

    • fread:读取二进制数据块。

  • 写入

    • fprintf:向文件中按格式写入数据,类似于printf

    • fputs:写入一行文本,不包括换行符。

    • fwrite:写入二进制数据块。

示例:

char buffer[100];
fgets(buffer, sizeof(buffer), fp);  // 从fp指向的文件中读取一行文本
fprintf(fp, "%s\n", "Hello, World!");  // 向fp指向的文件中写入一行文本
  1. 定位文件指针

使用fseek函数改变文件指针的位置,以便在文件的不同位置进行读写。fseek接受三个参数:文件指针、偏移量和起始点(SEEK_SETSEEK_CURSEEK_END分别代表文件开头、当前位置、文件结尾)。示例:

fseek(fp, 100, SEEK_SET);  // 将文件指针移动到距文件开头100字节的位置
  1. 检查文件状态:使用feofferrorftell函数检查文件状态:

    • feof(fp):检查是否已到达文件末尾。

    • ferror(fp):检查是否存在读写错误。

    • ftell(fp):返回当前文件指针的位置(相对于文件开头的字节数)。

  2. 关闭文件:使用fclose函数关闭已打开的文件,释放相关资源。示例:

fclose(fp);  // 关闭fp指向的文件

示例代码

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

int main() {
    FILE *fp;

    // 打开文件
    fp = fopen("example.txt", "w+");
    if (fp == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    // 写入数据
    fprintf(fp, "Hello, World!\n");

    // 重新定位文件指针
    fseek(fp, 0, SEEK_SET);

    // 读取数据
    char buffer[100];
    if (fgets(buffer, sizeof(buffer), fp)) {
        printf("Read from file: %s", buffer);
    }

    // 关闭文件
    if (fclose(fp) != 0) {
        perror("Failed to close file");
        return EXIT_FAILURE;
    }

    return 0;
}

0

评论区