C ~ 文件读写

2023-11-10

        一个文件,无论它是文本文件还是二进制文件都是代表了一系列的字节。如何创建、打开、关闭文本文件或二进制文件?C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件。

打开文件

        可以使用 fopen( ) 函数创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:

FILE *fopen( const char * filename, const char * mode );

        在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:

模式 描述
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,程序会从文件的开头写入内容。
a 打开一个文本文件,以追加模式写入文件。在这里,程序会在已有的文件内容中追加内容。如果文件不存在,则会创建一个新文件。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式

        如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

关闭文件

        使用 fclose( ) 函数关闭文件。函数的原型如下:

int fclose( FILE *fp );

        如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 stdio.h 中的常量。

        C 标准库提供了各种函数来按字符或者以固定长度字符串的形式读写文件。

写入文件

        函数fprintf()、fputs() 和 fputc()均为文件的顺序写操作函数,  其调用格式如下:

int fputc(int c, FILE* fp);
int fputs(const char* s, FILE* fp);
int fprintf(FILE* fp, const char* format, <variable-list>);

        函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回一个向文件所写字符的值。如果发生错误,则会返回 EOF,(文件结束结束其值为-1, 在stdio.h中定义)表示写操作错误。

        函数 fputs() 把以 null 结尾的字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回0,表明将string指针所指的字符串写入文件中的操作成功。返回非0时,  表明写操作失败

        函数fprintf()把一个字符串写入到文件中,fprintf() 函数的返回值为实际写入文件中的字符个数(字节数)。如果写错误, 则返回一个负数。

        实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int i = 996;  //定义整型变量并初始化
    char* s = "That's good news";  //定义字符串指针并初始化

    FILE* fp;  //声明一个文件指针
	fp = fopen("D://program//PPC.txt", "w+");  //打开文件,注意这里的形式,例如:"C://TC//TEST.DAT",别写成"C:/TC/TEST.DAT"

	/*写入文件*/          
    fputc('A', fp); //向所建文件写入字符‘A’:
    fputs("\nThis is testing for fputs...\n", fp);
	fprintf(fp, "This is testing for fprintf...\n");
    fprintf(fp, "%d\n", i); //向所建文件写一整型数
    fprintf(fp, "%s", s);   //向所建文件写一字符串
	
	fclose(fp);//关闭文件

    return 0;
}

        注意:确保有可用的 D:\program目录,如果不存在该目录,则需要先创建该目录。

        当上面的代码被编译和执行时,它会在 D:\program目录中创建一个新的文件 PPC.txt.

 读取文件

        函数fscanf()、fgets()fgetc()均为文件的顺序读操作函数, 其调用格式如下:

int fscanf(FILE *fp, const char *format, <address-list>);
char fgets(char *string, int n, FILE *fp);
int fgetc(FILE *fp);

       函数fscanf()的用法与scanf()函数相似,   只是它是从文件中读取字符串,但是在遇到第一个空格字符时,它会停止读取。 fscanf()函数的返回值为EOF(即-1), 表明读错误, 否则读数据成功。

       函数fgets()从文件中读取至多n-1个字符(n用来指定字符数), 并把它们放入string指向的字符串中, 在读入之后自动向字符串未尾加一个空字符null 。如果在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。读成功返回string指针, 失败返回一个空指针。

       注意:如果fgets()读到一个换行符,会把它储存在字符串中。这点与gets()不同,gets()会丢弃换行符。

       函数fgetc()从 fp 所指向的输入文件中读取一个字符, 返回值是读取的字符, 读错误时返回EOF。

        实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	char buff[255];

    FILE* fp;
	fp = fopen("D://program//PPC.txt", "r");

	fscanf(fp, "%s", buff);
	printf("1 : %s\n", buff);

	fgets(buff, 255, (FILE*)fp);  //从文件中读取255个字符,并把它们放入buff中
	printf("2: %s\n", buff);

	fgets(buff, 255, (FILE*)fp);
	printf("3: %s\n", buff);

    putchar(fgetc(fp));  //读取一个字符同时输出
	putchar('A');

	fclose(fp);

	return 0;
}

       当上面的代码被编译和执行时,它会读取上一部分创建的文件,产生下列结果:

1 : asdfghasdfgassDf
2:

3: dfgsadfgsdf452asdxfc542Szdxdfg

aA

       这里分析一下代码:

       fscanf函数读取字符,直至遇到Df后的空格后停止读取。此时,fgets函数遇到缓冲区的换行符,停止读取,并把换行符储存在字符串buff中。接着第15行printf()函数打印了buff,且又打印了换行符‘\n’,此时光标来到了第三行。第17行fgets()函数读取字符直到遇到“dfgsadfgsdf452asdxfc542Szdxdfg”后的换行符,接着第18行打印了buff和换行符 。接着两个putchar函数打印了:aA。

二进制 I/O 函数

       下面两个函数用于二进制输入和输出:

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
size_t fwrite(const void *ptr, size_t size_of_elements,size_t number_of_elements, FILE *a_file);

       fread()函数是从文件中读number_of_elements个字段, 每个字段长度为size_of_elements个字节, 并把它们存放到ptr指针所指的缓冲器中。
       fwrite()函数是把ptr指针所指的缓冲器中, 长度为size_of_elements个字节的number_of_elements个字段写到a_file指向的文件中去。

       实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
        float buff[6];
        float focus[6] = { 3.2, -4.34, 25.04, 0.1, 50.56, 80.5 };

        FILE* fp;
        fp = fopen("D://program//PPC.dat", "wb");  //以只写模式打开一个二进制文件,没有就创建它
        fwrite(focus, sizeof(float), 6, fp);  //将6个浮点数写入文件中
        fread(buff, sizeof(float), 1, fp);  //读取了1个float数
        fclose(fp);

        return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C ~ 文件读写 的相关文章

  • WritePrivateProfileString 未在末尾添加属性

    我正在使用以下命令在 ini 文件中写入一些属性WritePrivateProfileString函数并且一切正常 但是当我添加多行文本时 出现了问题 这是代码和输出 WritePrivateProfileString T General
  • 何时在定义上下文或实例化点中发生非依赖名称的重载解析?

    3 4 基本 lookup p1 重载解析 13 3 在名称查找成功后发生 void g long void g int int template
  • Windows 控制台中的 C++ 按键输入

    我目前正在开发各种consoleWindows 中的游戏无法通过常规输入真正运行cin 我怎样才能 以简单的方式仅使用 MSVC 中提供的标准 Windows 库 让程序等待 特定 按键并返回按键 ID 它必须适用于包括箭头键在内的所有按键
  • 验证码怎么写?

    我正在开发一个注册表 我想放置验证码 我生成一个随机字符串 但如何将其转换为图像 否则我如何开发验证码或任何参考 谢谢 Try out 验证码 http recaptcha net plugins aspnet 或查看博客文章 使用 Asp
  • 如何在 ASP.NET 5/vNext/Core 中使用 Elmah?

    我对如何在 ASP NET 5 MVC 6 项目中使用 Elmah 有点困惑 我从 nuget 得到了包 它添加了 Elmah Mvc 2 1 2 到project json 中的依赖项 我不知道从这里到哪里去 以前 nuget 会向 we
  • DPI 图形屏幕分辨率像素 WinForm PrintPageEventArgs

    对于运行我的应用程序的任何显示器 Dpi 点与像素有何关系 int points Screen primary public Form1 InitializeComponent points 1 primary null void OnPa
  • 单击按钮本地化应用程序

    我在我的项目 mainMaster 页面中找到了 imageButtons
  • 序列化 .NET WCF 服务的类型时出现问题:服务 WSDL 在 XSD 中定义空类型

    我正在使用 WCF 编写一个 Web 服务 我创建了数据合约 我创建了我的服务合同 界面 我定义了方法 其参数的类型与数据契约相同 我实现了创建服务类的服务合同 我使用 svc 文件和 IIS 托管我的服务 我尝试了我的服务 寻找http
  • 字符串中unicode字符的正则表达式

    我正在使用 C 进行一些 OCR 工作 并提取了我需要使用的文本 现在我需要使用正则表达式解析一行 string checkNum string routingNum string accountNum Regex regEx new Re
  • 无法运行bjam编译boost python教程

    我正在尝试跟随本教程 http www boost org doc libs 1 55 0 libs python doc tutorial doc html python hello html关于为 Windows 的 python 包装
  • 无效的跨线程访问问题

    我有两个 ViewModel 类 PersonViewModel 和 PersonSearchListViewModel PersonViewModel 实现的字段之一是通过 WCF 下载的个人资料图像 本地缓存在独立存储中 PersonS
  • WinForms TreeView - 如何手动“突出显示”节点(就像被单击一样)

    我需要知道如何让以编程方式选择的节点以图形方式处于 选定 状态 就像用户单击它一样 SelectedNode 仅使这一节点在内部被选中 非常感谢 它没有显示为突出显示的原因是由于树视图没有焦点 这是我的测试表单上的按钮单击事件 TreeVi
  • 如何检测机器是否加入域?

    如何检测计算机是否已加入 Active Directory 域 相对于工作组模式 如果没有必要的话 不要用 pinvoke 来愚弄 参考System DirectoryServices 然后调用 System DirectoryServic
  • 最好的 C++ 编译器是哪个? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 让 AutoMapper 自动映射前缀属性

    我希望 AutoMapper 自动映射成员 如下所示 class Model public int ModelId get set class ModelDto public int Id get set 在这里 我会做一个 CreateM
  • 为什么 `boost::any` 比 `void*` 更好?

    有什么先天优势boost any and boost any cast提供超过使用void and dynamic cast 优点是boost any比类型安全得多void E g int i 5 void p i static cast
  • 模板是如何实例化的?

    这是一个练习 来自C 入门第五版 练习 16 27 对于每个带标签的语句 解释什么 如果有 实例化发生 如果实例化了模板 请解释原因 如果 不 请解释为什么不 第677页 template
  • 如何在 C# 中读取 Visio 文档内容

    我的DLL库代码如下 using System using IVisio Microsoft Office Interop Visio namespace Emix public class Visio protected String p
  • MSAL.Net 没有帐户或登录提示传递到 AcquireTokenSilent 调用

    我见过很多相同或类似的问题 并尝试了他们所有的答案 如果有的话 但这些都不适合我 我在用着这个例子 https github com Azure Samples ms identity javascript angular spa aspn
  • 类型 '' 未映射

    我已经尝试修复这个错误有一段时间了 每当我的应用程序尝试创建数据上下文的实例时 我都会收到此错误 下面是代码 using System using System Collections Generic using System Linq u

随机推荐

  • fff

    http www migucloud com vi0 109 3j KJ59CLFb6F9pvcJ1egcF cld450p FILENAME 54 cld450p mp4 duration 201 owner 109 path 109 3
  • linux 杀死进程失败,linux - Ubuntu关闭失败“ *杀死所有剩余进程…” - Ubuntu问答...

    问题描述 我已经重新安装了Ubuntu Server reboot 有效 但是在 Killing all remaining processes 步骤上关闭失败 我在用 sudo shutdown now 在失败之后 由 fail 指示 f
  • 【廖雪峰python入门笔记】函数

    1 函数 我们知道圆的面积计算公式为 S r 当我们知道半径r的值时 就可以根据公式计算出面积 假设我们需要计算3个不同大小的圆的面积 r1 12 34 r2 9 08 r3 73 1 s1 3 14 r1 r1 s2 3 14 r2 r2
  • 深入学习java源码之ArrayList.iterator()与ArrayList.listIterator()

    深入学习java源码之ArrayList iterator 与ArrayList listIterator 内部类的使用典型的情况是 内部类继承自某个类或实现某个接口 内部类的代码操作创建其的外层类的对象 所以你可以认为内部类提供了某种进入
  • php excel导入

    excel导入导出是我们做项目中经常用到的功能 那么 今天就来说说excel导入 一 类文件 二 调用代码
  • 使用 htmx 构建交互式 Web 应用

    学习目标 了解htmx的基本概念 特点和用法 并能够运用htmx来创建交互式的Web应用程序 学习内容 1 什么是htmx htmx是一种用于构建交互式Web应用程序的JavaScript库 它通过将HTML扩展为一种声明性的交互式语言 使
  • 深入webpack打包原理,loader和plugin的实现

    本文讨论的核心内容如下 webpack进行打包的基本原理 如何自己实现一个loader和plugin 注 本文使用的webpack版本是v4 43 0 webpack cli版本是v3 3 11 node版本是v12 14 1 npm版本v
  • uboot启动流程图以及boot启动linux流程图

    运行厂商u boot的前提 运行u boot 需要DDR或者DRAM 串口 SD卡驱动 EMMC NAND 这些要和厂商的开发板一致 就能直接在自己板子上运行u boot 开机流程 当把u boot bin下载到SD卡上时 由于整个u bo
  • Web Scraping指南: 使用Selenium和BeautifulSoup

    在当今信息时代 数据是无处不在的宝贵资源 对于许多企业 研究人员以及开发者来说 从互联网上获取准确且有价值的数据变得越来越重要 而Web scraping 网络爬虫 技术则成为了实现这一目标的关键工具 本篇文章将向您介绍一个高级Web Sc
  • 学习Linux第六天

    linux中命令的匹配顺序 1 别名 gt 2 命令缓存 gt 3 通过相提并论中所定义的命令文件路径开始匹配 alias 命令别名 alias 别名 命令本身 alias cc touch root www tm tm不是别名命令 通过
  • 明星漫画

    明星漫画 转载于 https www cnblogs com Dicky archive 2005 02 24 122393 html
  • 《C++编程规范:101条规则、准则与最佳实践》——1.5做代码审查

    本节书摘来自异步社区出版社 C 编程规范 101条规则 准则与最佳实践 一书中的第1章 第1 5节 作者 加 Herb Sutter 罗 Andrei 更多章节内容可以访问云栖社区 异步社区 公众号查看 1 5做代码审查 摘要审查代码 更多
  • 数组sort方法的使用

    sort 方法是数组自带的一种排序方法 数组在原数组上进行排序 不生成副本 如果调用该方法时没有使用参数 将按字母顺序对数组中的元素进行排序 说得更精确点 是按照字符编码的顺序进行排序 要实现这一点 首先应把数组的元素都转换成字符串 如有必
  • Spring_day01

    Spring day01 一 spring入门 1 什么是框架 源自于建筑学 隶属土木工程 后发展到软件工程领域 软件工程框架 经过验证的 具有一定功能的 半成品软件 经过验证 具有一定功能 半成品 2 框架的作用 3 spring是一个轻
  • C51单片机实验——LCD 1602液晶显示器

    实验名称 利用1602实现数字时钟 实验环境 普中实验系统 Keil Vision 4软件 实验目的 1 掌握1602液晶显示器的工作原理和接口方法 2 利用本课程前面所学的知识 实现数字时钟功能 硬件连线 LCD1602的RS R W 和
  • Arduino core for ESP8266 安装失败问题处理方法

    文章目录 目的 离线开发板数据包 鱼 安装最新开发板数据包 渔 总结 目的 理论上Arduino IDE安装开发板数据包是非常方便的 不过在国内的网络环境下有时候就会很纠结 另外Arduino IDE对于下载数据这块也存在问题 经常下着下着
  • 【LeetCode - 658】找到 K 个最接近的元素

    文章目录 1 题目描述 2 解题思路 3 解题代码 1 题目描述 2 解题思路 题目给定的函数返回的是 List 类型 List 有一个方法和字符串类似 为 subList a b 返回 list 区间 a b 的子序列 先把给定的 arr
  • xshell以及xftp免费版

    https www netsarang com zh free for home school
  • GdiPlus

    GDI是Graphics Device Interface的缩写 含义是图形设备接口 它的主要任务是负责系统与绘图程序之间的信息交换 处理所有Windows程序的图形输出 在Windows操作系统下 绝大多数具备图形界面的应用程序都离不开G
  • C ~ 文件读写

    一个文件 无论它是文本文件还是二进制文件 都是代表了一系列的字节 如何创建 打开 关闭文本文件或二进制文件 C 语言不仅提供了访问顶层的函数 也提供了底层 OS 调用来处理存储设备上的文件 打开文件 可以使用 fopen 函数来创建一个新的