当前位置: 首页 > article >正文

(10)文件操作

1. 文件指针的概念和定义

在 C 语言中,文件指针是一种特殊的指针,用于指向一个文件结构体。这个结构体包含了文件的各种信息,如文件名、文件状态、当前文件位置指针等。通过文件指针,程序可以对文件进行各种操作。

文件指针的定义形式如下:

FILE *fp;

这里FILE是一个在<stdio.h>头文件中定义的结构体类型,fp就是我们定义的文件指针变量。

2. 文件的打开方法、文件打开函数返回值的处理

文件打开函数 - fopen()

在 C 语言中,使用fopen()函数来打开文件。其基本语法如下:

FILE *fopen(const char *filename, const char *mode);
  • filename是要打开的文件的名称(包括路径,如果文件不在当前目录下)。例如:"data.txt"或者"C:/myfiles/data.bin"
  • mode是打开文件的模式,不同的模式决定了文件的操作方式,常见的模式如下:
    • 文本文件模式
      • "r":以只读方式打开文件,文件必须存在。
      • "w":以只写方式打开文件,如果文件存在则清空内容,如果文件不存在则创建新文件。
      • "a":以追加方式打开文件,在文件末尾添加内容,如果文件不存在则创建新文件。
      • "r+":以读写方式打开文件,文件必须存在。
      • "w+":以读写方式打开文件,先清空文件内容(如果存在)或创建新文件。
      • "a+":以读写方式打开文件,追加模式,文件不存在则创建。
    • 二进制文件模式:在上述模式字符串后添加"b",如"rb""wb""ab"等,表示以二进制方式操作文件。
文件打开函数返回值的处理

fopen()函数返回一个FILE *类型的指针,如果成功打开文件,则返回指向该文件的指针;如果打开文件失败,则返回NULL。因此,在打开文件后,应该检查返回值,以确保文件打开成功。例如:

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

int main() {
    FILE *fp;
    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    // 文件操作...
    fclose(fp);
    return 0;
}

在这个示例中,如果fopen()返回NULL,使用perror()函数输出错误信息,并返回EXIT_FAILURE表示程序执行失败。

3. 在程序中读写外部的文本文件或者二进制文件的方法

文本文件的读写
  • 读文本文件 - fgets()fscanf()函数
    • fgets()函数:用于从文件中读取一行字符串。其语法如下:
char *fgets(char *str, int n, FILE *stream);

str是存储读取字符串的字符数组,n是最多读取的字符数(包括'\0'),stream是文件指针。例如:

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

int main() {
    FILE *fp = fopen("text.txt", "r");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    char line[100];
    while (fgets(line, 100, fp)!= NULL) {
        printf("%s", line);
    }
    fclose(fp);
    return 0;
}
- **`fscanf()`函数**:类似于`scanf()`,但用于从文件中读取格式化数据。例如:
#include <stdio.h>
#include <stdlib.h>

struct Student {
    char name[20];
    int age;
};

int main() {
    FILE *fp = fopen("students.txt", "r");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    struct Student student;
    while (fscanf(fp, "%s %d", student.name, &student.age)!= -1) {
        printf("姓名: %s, 年龄: %d\n", student.name, student.age);
    }
    fclose(fp);
    return 0;
}
  • 写文本文件 - fputs()fprintf()函数
    • fputs()函数:用于向文件中写入一个字符串(不自动添加'\0')。其语法如下:
int fputs(const char *str, FILE *stream);

例如:

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

int main() {
    FILE *fp = fopen("output.txt", "w");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    char str[] = "这是要写入文件的内容";
    fputs(str, fp);
    fclose(fp);
    return 0;
}
- **`fprintf()`函数**:类似于`printf()`,但用于向文件中写入格式化数据。例如:
#include <stdio.h>
#include <stdlib.h>

struct Student {
    char name[20];
    int age;
};

int main() {
    FILE *fp = fopen("students_info.txt", "w");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    struct Student student = {"张三", 20};
    fprintf(fp, "姓名: %s, 年龄: %d\n", student.name, student.age);
    fclose(fp);
    return 0;
}
二进制文件的读写
  • 读二进制文件 - fread()函数
    fread()函数用于从文件中读取二进制数据。其语法如下:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

ptr是存储读取数据的内存地址,size是每个数据元素的大小,count是要读取的元素个数,stream是文件指针。例如,读取一个包含整数的二进制文件:

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

int main() {
    FILE *fp = fopen("data.bin", "rb");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    int buffer[10];
    size_t elements_read = fread(buffer, sizeof(int), 10, fp);
    printf("成功读取 %zu 个整数\n", elements_read);
    for (int i = 0; i < elements_read; i++) {
        printf("%d ", buffer[i]);
    }
    fclose(fp);
    return 0;
}
  • 写二进制文件 - fwrite()函数
    fwrite()函数用于向文件中写入二进制数据。其语法如下:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

例如,将一个整数数组写入二进制文件:

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

int main() {
    int data[] = {1, 2, 3, 4, 5};
    FILE *fp = fopen("output.bin", "wb");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    size_t elements_written = fwrite(data, sizeof(int), 5, fp);
    printf("成功写入 %zu 个整数\n", elements_written);
    fclose(fp);
    return 0;
}

通过上述方法,可以在 C 程序中方便地对文本文件和二进制文件进行读写操作,实现数据的存储和读取。同时,注意在操作完文件后,使用fclose()函数关闭文件,释放相关资源。


http://www.kler.cn/a/375532.html

相关文章:

  • TS 项目中给常用的路径定义一个别名 tsconfig.json
  • 微服务实战系列之玩转Docker(十六)
  • 补齐:相交链表:扣160
  • 【Java SE】类型转换
  • 龙迅#LT8668EX显示器图像处理芯片 适用于HDMI1.4+VGA转4PORT LVDS,支持4K30HZ分辨率,可做OSD菜单亮度调节!
  • vite+vue3+ts使用vue3-draggable-resizable,可拖动、调整大小的模块库,真的太好用了!
  • linux虚拟机上使用USB转串口工具
  • HTTP 全知道:请求与响应的深度剖析
  • Spring Boot JPA中的Page组件详解
  • 【时间之外】IT人求职和创业应知【23】
  • 【日常记录-Java】JarFile
  • Gorilla Mk1机器人:CubeMars电机加持,助力高空作业新突破
  • 3259. 超级饮料的最大强化能量
  • 【AI人工智能】给GPT一个英文文档,让它进行翻译,总结。
  • linux图形化X窗口
  • 商品详情API接口系列(json数据示例演示)
  • Lucene的使用方法与Luke工具(2)
  • 基于redis实现延迟队列
  • 【Docker项目实战】使用Docker安装Blossom 笔记应用
  • 【LangChain系列4】【Chain模块详解】
  • 【2025最新整理】ResNet 系列网络的演进及其创新
  • lanqiaoOJ 3255:重新排队 ← STL list 单链表
  • 【贪心算法】(第十三篇)
  • Linux---cp命令
  • 【p2p、分布式,区块链笔记 Torrent】WebTorrent 的lt_donthave插件
  • 软件测试学习笔记丨Flask操作数据库-数据库和表的管理