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

快速入门文件操作+5种例子演示

文件操作

    • 基本操作
      • 注意事项
      • 例子1:读取文件内容
      • 例子2:写入文件内容
      • 例子3:追加文件内容
      • 例子4:读取并写入文件内容(复制文件)
      • 例子5:使用二进制模式读写文件

基本操作

在C语言中,使用文件操作功能通常涉及以下步骤:

  1. 包含头文件
    首先,你需要包含 stdio.h 头文件,因为所有的标准I/O函数(包括文件操作函数)都定义在这个头文件中。

    #include <stdio.h>
    
  2. 打开文件
    使用 fopen 函数打开文件。你需要指定文件名和打开模式(如 “r” 用于读取,“w” 用于写入,“a” 用于追加等)。

    FILE *file = fopen("filename.txt", "r"); // 打开文件用于读取
    if (file == NULL) {perror("打开文件失败");return 1; // 返回非零值表示错误
    }
    

    如果文件不存在或无法打开,fopen 将返回 NULL,并可以通过 perror 函数打印出错误信息。
    打开模式
    不同的文件打开模式决定了文件如何被访问。常用的模式有:

    • "r":只读模式。
    • "w":写入模式(如果文件不存在则创建它,如果文件已存在则删除它的内容)。
    • "a":追加模式(如果文件不存在则创建它,如果文件已存在则追加到文件末尾)。
    • "r+":读写模式(从文件开头开始)。
    • "w+":读写模式(与 “w” 相同,但允许读取)。
    • "a+":读写模式(与 “a” 相同,但允许读取)。
    • "rb""wb""ab""r+b""w+b""a+b":二进制模式(与上面的文本模式相同,但用于二进制文件)。
  3. 读取或写入文件
    根据打开模式,你可以使用不同的函数来读取或写入文件。

    • 读取文本文件:fgets, fscanf
    • 写入文本文件:fputs, fprintf
    • 读取二进制文件:fread
    • 写入二进制文件:fwrite

    例如,读取文本文件:

    char buffer[1024];
    while (fgets(buffer, sizeof(buffer), file)) {printf("%s", buffer);
    }
    

    写入文本文件:

    fprintf(file, "这是写入文件的内容\n");
    
  4. 文件位置控制(可选):
    如果需要,可以使用 fseekftellrewind 等函数来控制文件位置。

    • fseek:用于设置文件位置指针。
    • ftell:返回当前文件位置指针的位置。
    • rewind:将文件位置指针重置到文件开头。

文件定位(如果需要):
如果你想在文件中移动位置(例如,从文件中间开始读取或写入),你可以使用 fseek 函数。

 fseek(file, 10, SEEK_SET); // 从文件开头向后移动10个字节

获取文件状态信息
使用 ftell 函数可以获取当前文件位置指示器的位置。

long position = ftell(file); // 获取当前位置
  1. 关闭文件
    使用 fclose 函数关闭文件。这是一个重要的步骤,因为它会确保所有的数据都被正确地写入磁盘,并释放与文件关联的所有资源。
 fclose(file); // 关闭文件
  1. 错误处理
    始终检查 fopen 的返回值,以确保文件已成功打开。如果 fopen 返回 NULL,则表示打开文件失败。

完整示例

#include <stdio.h>int main() {FILE *file;char buffer[1024];// 打开文件用于读取file = fopen("example.txt", "r");if (file == NULL) {perror("打开文件失败");return 1;}// 读取并打印文件内容while (fgets(buffer, sizeof(buffer), file)) {printf("%s", buffer);}// 关闭文件fclose(file);file = NULL;return 0;
}

注意事项

  • 确保你有足够的权限来读取或写入文件。
  • 读取文件时,要注意缓冲区的大小,以防止缓冲区溢出。
  • 写入文件时,要注意写入的数据类型和格式,以确保数据被正确地写入文件。
  • 在使用完文件后,始终使用fclose关闭文件,以释放资源并避免潜在的问题。
  • 如果文件操作可能失败(例如,文件不存在或磁盘空间不足),请确保你的代码能够妥善处理这些错误情况。

例子1:读取文件内容

#include <stdio.h>int main() {FILE *file;char line[1024];file = fopen("example.txt", "r"); // 以只读模式打开文件if (file == NULL) {perror("打开文件失败");return 1;}// 逐行读取文件并打印while (fgets(line, sizeof(line), file)) {printf("%s", line);}fclose(file); // 关闭文件file = NULL;return 0;
}

例子2:写入文件内容

#include <stdio.h>int main() {FILE *file;file = fopen("output.txt", "w"); // 以写入模式打开文件if (file == NULL) {perror("打开文件失败");return 1;}// 写入多行文本到文件fprintf(file, "这是第一行文本\n");fprintf(file, "这是第二行文本\n");fclose(file); // 关闭文件file = NULL;return 0;
}

例子3:追加文件内容

#include <stdio.h>int main() {FILE *file;file = fopen("example.txt", "a"); // 以追加模式打开文件if (file == NULL) {perror("打开文件失败");return 1;}// 追加文本到文件末尾fprintf(file, "这是追加到文件末尾的文本\n");fclose(file); // 关闭文件file = NULL;return 0;
}

例子4:读取并写入文件内容(复制文件)

#include <stdio.h>int main() {FILE *source, *dest;char ch;source = fopen("source.txt", "r"); // 打开源文件if (source == NULL) {perror("打开源文件失败");return 1;}dest = fopen("destination.txt", "w"); // 打开目标文件if (dest == NULL) {fclose(source); // 释放源文件句柄perror("打开目标文件失败");return 1;}// 从源文件读取内容并写入到目标文件while ((ch = fgetc(source)) != EOF) {fputc(ch, dest);}fclose(source); // 关闭源文件source = NULL;fclose(dest);   // 关闭目标文件dest = NULL;return 0;
}

例子5:使用二进制模式读写文件

#include <stdio.h>int main() {FILE *file;unsigned char buffer[1024];size_t n;// 以二进制写入模式打开文件file = fopen("binary_file.bin", "wb");if (file == NULL) {perror("打开文件失败");return 1;}// 写入一些二进制数据到文件unsigned int data = 0x12345678;fwrite(&data, sizeof(data), 1, file);fclose(file); // 关闭文件// 以二进制读取模式重新打开文件file = fopen("binary_file.bin", "rb");if (file == NULL) {perror("打开文件失败");return 1;}// 从文件中读取二进制数据n = fread(buffer, sizeof(unsigned char), sizeof(buffer), file);if (n > 0) {// 假设我们读取了整个unsigned int的数据if (n >= sizeof(unsigned int)) {unsigned int *read_data = (unsigned int*)buffer;printf("读取到的数据是: 0x%X\n", *read_data);}}fclose(file); // 关闭文件file = NULL;return 0;
}

相关文章:

  • 前端项目如何排查是否使用第三方.ttf
  • Docker中布置Jenkins实现Android项目的自动化构建
  • Django 创建项目及应用
  • elementui中的表单,根据条件判断切换是否必填
  • [Windows] 植物大战僵尸杂交版
  • 【NOI】C++程序结构入门之循环结构二-for循环
  • 非计算机行业的人,如何使用大模型进行自媒体创作
  • 【MySQL】库和表的操作
  • 【C++奇技淫巧】CRTP(奇特重现模板模式)
  • 为了搞清楚 DNS,我花了 1.99 买了一个域名
  • Esxi_FAQ_2024.6.3
  • 实用篇| huggingface网络不通
  • 【Node】node的Console模块使用。
  • 【面试题-012】什么是Spring 它有哪些优势
  • 回溯算法题模板与实战详解
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【前端学习】-粗谈选择器
  • CODING 缺陷管理功能正式开始公测
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • es6要点
  • Java读取Properties文件的六种方法
  • Java教程_软件开发基础
  • MQ框架的比较
  • mysql innodb 索引使用指南
  • Node 版本管理
  • overflow: hidden IE7无效
  • 浮现式设计
  • 技术胖1-4季视频复习— (看视频笔记)
  • 码农张的Bug人生 - 见面之礼
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 学习ES6 变量的解构赋值
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 怎样选择前端框架
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​马来语翻译中文去哪比较好?
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #pragma pack(1)
  • (03)光刻——半导体电路的绘制
  • (1)STL算法之遍历容器
  • (1)虚拟机的安装与使用,linux系统安装
  • (2015)JS ES6 必知的十个 特性
  • (4)Elastix图像配准:3D图像
  • (52)只出现一次的数字III
  • (55)MOS管专题--->(10)MOS管的封装
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (补充)IDEA项目结构
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)负载均衡,回话保持,cookie
  • (转)为C# Windows服务添加安装程序
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation