C语言文件打开关闭详解、文件顺序读写详解。

news2024/12/25 9:04:13

文件的打开和关闭

fopen函数原型:

FILE *fopen( const char *filename, const char *mode );
  • const char *filename 文件的路径以及名字
  • const char *mode 文件的打开方式
文件打开方式含义如果文件不存在
“r”文件不存在会报错
“w”写(清空写)建立一个新的文件
“a”写(追加写)建立一个新的文件
“r+”读写文件不存在会报错
“w+”读写(清空写)建立一个新的文件
“a+”读写(追加写)建立一个新的文件
“rb”读二进制文件文件不存在会报错
“wb”写二进制文件(清空写)建立一个新的文件
“ab”写二进制文件(追加写)建立一个新的文件
“rb+”读写二进制文件文件不存在会报错
“wb+”读写二进制文件(清空写)建立一个新的文件
“ab+”读写二进制文件(追加写)建立一个新的文件
  • FILE *fopen 返回一个指向 FILE类型数据的指针变量,通过 FILE*指针指向某个文件的信息区(是一个结构体变量),通过文件信息区就能够访问该文件。如果打开失败返回 NULL 指针

注:使用 "w" 的方式打开文件,会将文件中的内容清空在写。当你使用 "w"的方式打开文件,但是不写任何内容,有清空文件的效果。

文件路径的两种书写方式:

1.使用反斜杠 \ 会使后面的字符转义,所以需要使用 \\两个反斜杠代表一个斜杠。

FILE* fp = fopen("D:\\test.txt" , "w");

2.使用 / 就不需要考虑转义字符的问题了。

FILE* fp = fopen("D:/test.txt", "w");

fclose函数原型:

int fclose( FILE *stream );
  • FILE *stream 指向文件流的指针
  • int fclose 关闭成功返回 0 关闭失败返回 EOF

例1:

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

int main() {

	// 打开文件
	//FILE* fp = fopen("D:\\test.txt" , "w");
	FILE* fp = fopen("D:/test.txt", "w");
	if (fp == NULL) {
		perror("fopen:");
		exit(-1);
	}
	// 文件操作
	// ...

	// 关闭文件
	fclose(fp);
	fp = NULL;


	return 0;
}

文件的顺序读写

功能函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
字符串输入函数fgets所有输入流
字符串输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件流
二进制输出fwrite文件流

stdin 标准输入流(键盘),stdout 标准输出流(屏幕)。

1.fgetc

函数原型:

int fgetc( FILE *stream );
  • FILE *stream 输入流
  • int fgetc 返回该字符的 ASCII 值,失败或文件结束返回 EOF

例:

#include <stdio.h>

int main() {

	FILE* fp = fopen("D:/test.txt", "r");
	if (fp == NULL) {
		perror("fopen:");
		exit(-1);
	}
	char ch = fgetc(fp);
	putchar(ch);

	fclose(fp);
	fp = NULL;

	return 0;
}

2.fputc

函数原型:

int fputc( int c, FILE *stream );
  • int c 输出的字符
  • FILE *stream 输出流
  • int fputc 返回该字符的 ASCII 值,失败返回 EOF

例:

#include <stdio.h>

int main() {

	FILE* fp = fopen("D:/test.txt" , "w");
	if (fp == NULL) {
		perror("fopen:");
		exit(-1);
	}
	fputc('a' , fp);
	
	fclose(fp);
	fp = NULL;

	return 0;
}

注:fgetc(stdin) == getchar(); fputc('a' , stdout) == putchar('a');


3.fputs

函数原型:

int fputs( const char *string, FILE *stream );
  • const char *string 输出的字符串
  • FILE *stream 输出流
  • int fputs 成功返回非负的值,失败返回 EOF

例:

#include <stdio.h>

int main() {

	FILE* fp = fopen("D:/test.txt" , "w");
	if (fp == NULL) {
		perror("fopen:");
		exit(-1);
	}

	fputs("abcdefg" , fp);

	fclose(fp);
	fp = NULL;


	return 0;
}

4.fgets

函数原型:

char *fgets( char *string, int n, FILE *stream );
  • char *string 这是指向一个字符数组的指针,用来存放读取到的字符串。
  • int n 最大读到字符个数,包含 '\0' ,实际读到 n-1 个字符
  • FILE *stream 输入流
  • char *fgets 如果成功返回读取到字符串的首元素地址,失败或者文件结束返回 EOF

例:

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

int main() {

	FILE* fp = fopen("D:/test.txt", "r");
	if (fp == NULL) {
		perror("fopen:");
		exit(-1);
	}

	char buffer[256] = { 0 };
	char * res = fgets(buffer , 7 , fp);
	if (res == NULL) {
		perror("fgets:");
		exit(-1);
	}
	fputs(buffer , stdout);

	fclose(fp);
	fp = NULL;


	return 0;
}

5.fprintf

函数原型:

int fprintf( FILE *stream, const char *format [, argument ]...);
  • FILE *stream 输出流
  • const char *format [, argument ]... 格式化数据和 printf 用法类似

例:

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

typedef struct Data {
	int order;
	double score;
}Data;

int main() {

	Data data = { 1 , 100 };
	FILE* fp = fopen("D:/test.txt", "w");
	if (!fp) {
		perror("fopen:");
		exit(-1);
	}

	fprintf(fp , "%d %lf" , data.order , data.score);

	fclose(fp);
	fp = NULL;


	return 0;
}

在这里插入图片描述


6.fscanf

函数原型:

int fscanf( FILE *stream, const char *format [, argument ]... );
  • FILE *stream 输入流
  • const char *format [, argument ]... 格式化数据和 scanf 用法类似
  • int fscanf 读取成功返回读入的参数的个数,失败返回 EOF

例:

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

typedef struct Data {
	int order;
	double score;
}Data;

int main() {

	Data temp = { 0 };
	FILE* fp = fopen("D:/test.txt", "r");
	if (!fp) {
		perror("fopen:");
		exit(-1);
	}

	fscanf(fp , "%d %lf" , &temp.order , &temp.score);
	fprintf(stdout , "%d %lf", temp.order, temp.score);

	fclose(fp);
	fp = NULL;

	return 0;
}

在这里插入图片描述


7.fwrite

函数原型:

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
  • const void *buffer 指向要写入数据的指针
  • size_t size 每个元素的字节大小
  • size_t count 写入元素的个数
  • FILE *stream 文件流

例:

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

typedef struct Data {
	char name[20];
	int order;
}Data;

int main() {

	Data data = { "孙悟空" , 1 };
	FILE* fp = fopen("D:/test.txt", "wb");
	if (!fp) {
		perror("fopen:");
		exit(-1);
	}

	fwrite(&data , sizeof(data) , 1 , fp);

	fclose(fp);
	fp = NULL;

	return 0;
}

8.fread

函数原型:

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
  • void *buffer 这是指向一个存放读取到的数据的指针。
  • size_t size 每个元素的字节大小
  • size_t count 读入元素的个数
  • FILE *stream 文件流
  • size_t fread 返回成功读取的对象个数,若出现错误或到达文件末尾,则可能小于 count

例:

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

typedef struct Data {
	char name[20];
	int order;
}Data;

int main() {

	Data temp = { 0 };
	FILE* fp = fopen("D:/test.txt", "rb");
	if (!fp) {
		perror("fopen:");
		exit(-1);
	}

	fread(&temp, sizeof(temp), 1, fp);
	printf("%s %d" , temp.name , temp.order);

	fclose(fp);
	fp = NULL;

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【新手上路】如何在Web3时代成为XR创建者

目录 0 XR在Web3里的作用 1 XR的概念、特征、技术、设备、平台、应用和工具 1.1 VR的概念、特征和技术 1.2 AR的概念、特征和技术 1.2 XR的设备、平台、应用和工具 2 选择XR的方法 2.1 何时使用VR 2.2 何时使用AR 3 开发XR作品的4个步骤 4 成为XR构建者的路径 4.1 三…

小程序布局中相对定位的用法

小程序中一般为了有一定的设计效果&#xff0c;会将下边组件的内容提升一点到上边去&#xff0c;比如我们的电商展示模板里&#xff0c;会将商品列表覆盖一点到背景图&#xff0c;效果如下&#xff1a; 这种要如何搭建呢&#xff1f;就是利用到了CSS相对定位的原理 搭建组件 …

27.移除元素

LeetCode-27.移除元素 1、题目描述2、解题思路3、代码实现3.1Java代码实现3.2双指针代码优化 4、解题记录 1、题目描述 题目描述&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要…

windows搭建vue开发环境

参考博客&#xff1a;最详细的vue安装教程_一只野生程序媛的博客-CSDN博客 Vue安装环境最全教程&#xff0c;傻瓜式安装_浪漫主义码农的博客-CSDN博客 1、安装nodejs&#xff0c;从下面官网下载版本&#xff0c;对应安装就行了&#xff1a; Node.js 中文网 2、安装好后&…

合宙Air724UG Cat.1模块硬件设计指南--天线接口

天线接口 简介 天线是发射和接收电磁波的一个重要的无线电设备&#xff0c;没有天线也就没有无线电通信。天线品种繁多&#xff0c;以供不同频率、不同用途、不同场合、不同要求等不同情况下使用。 特性 LTE天线接口。50 欧姆特性阻抗&#xff0c;不推荐使用PCB板载天线&#…

脚本模式的特点和用法

一、什么是脚本? 脚本(script)是使用一种特定的描述性语言&#xff0c;依据一定的格式编写的可执行文件&#xff0c;又称作宏或批处理文件。脚本通常可以由应用程序临时调用并执行。 简单解释:脚本类似于演戏时用到的剧本&#xff0c;脚本其实就是一系列指令——演员看了指令就…

算法--itemCF

概述&#xff1a; 电子商务网站是个性化 推荐系统重要地应用的领域之一。亚马逊就是个性化推荐系统的积极应用者和推广者&#xff0c;亚马逊的推荐系统深入到网站的各类商品&#xff0c;为亚马逊带来了至少30%的销售额。 不光是电商类&#xff0c;推荐系统无处不在。 QQ&…

【差旅-游记】记一次海南出差

哈喽&#xff0c;大家好&#xff01;我是雷工&#xff01; 这篇不是技术分享&#xff0c;是篇差旅记录。 最近出差去了一次海南&#xff0c;应该算得上我目前出差去过最远的地方了&#xff0c;也是我第一次去海南&#xff0c;还是蛮有新鲜感的&#xff0c;因此记录下此次差旅。…

【软件设计师暴击考点】数据库系统高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

tensorflow2 模型建立与训练

模型的构建&#xff1a; tf.keras.Model 和 tf.keras.layers 模型的损失函数&#xff1a; tf.keras.losses 模型的优化器&#xff1a; tf.keras.optimizer 模型的评估&#xff1a; tf.keras.metrics 模型&#xff08;Model&#xff09;与层&#xff08;Layer&#xff09; …

Mysql 索引基础介绍

索引基础介绍 索引是什么 MySQL官方&#xff1a;索引&#xff08;INDEX&#xff09;是帮助MySQL高效获取数据的数据结构。 面试官问&#xff0c;回&#xff1a;索引是排好序的快速查找数据结构 索引的目的在于提高查询效率&#xff0c;可以类比字典的目录。如果要查mysql这个这…

13. python从入门到精通——Python操作数据库

数据库编程接口&#xff1a;python database API python database API概述 python database API 规范对于关系数据库的访问&#xff0c;Python社区已经制定出一个标准&#xff0c;称为Python Database API&#xff0c;通过这个接口使python跨不同数据库的操作代码可以更加具有…

动态内存管理(malloc,calloc,realloc)

文章目录 1.为什么存在动态内存分配 2.动态内存函数的介绍 3.常见的动态内存错误 4.几个经典的笔试题 5. C/C程序的内存开辟 文章内容 1.为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};/…

【javascript】闭包

通过定时器从第一个元素开始往后&#xff0c;每隔一秒输出arr数组中的一个元素。 <script>var arr [one, two, three];for(var i 0; i < arr.length; i) {setTimeout(function () {console.log(arr[i]);}, i * 1000);} </script> 但是运行过后&#xff0c;我…

使用生成 AI 实现准确的新闻摘要

shadow 这篇文章介绍了作者 Alessandro Alviani 的实践经验&#xff0c;非常有参考价值。 指令冗余&#xff0c;多步引导&#xff0c;是目前提高LLM输出质量的方法之一。 Towards Accurate Quote-Aware Summarization of News using Generative AI Alessandro Alviani generati…

电容式电动汽车路径规划问题的双级蚁群优化算法

摘要&#xff1a; 电动汽车&#xff08;EV&#xff09;技术的发展导致了一个新的车辆路由问题&#xff08;VRP&#xff09;&#xff0c;称为有容量的电动汽车路由问题&#xff08;CEVRP&#xff09;。由于充电站的数量有限&#xff0c;电动汽车的巡航范围有限&#xff0c;不仅要…

【从零开始学习JAVA | 第十九篇】初识内部类

前言&#xff1a; 内部类是类的五大成员。一个类的其他的成员分别是属性&#xff0c;方法&#xff0c;构造方法&#xff0c;代码块。本文将详细介绍什么是内部类&#xff0c;以及内部类的意义。 内部类&#xff1a; 内部类&#xff08;Inner Class&#xff09;是 Java 中的一个…

MedViT:一种用于广义医学图像分类的鲁棒Vision Transformer

文章目录 MedViT: A Robust Vision Transformer for Generalized Medical Image Classification摘要本文方法Locally Feed-Forward Network 实验实验结果 MedViT: A Robust Vision Transformer for Generalized Medical Image Classification 摘要 卷积神经网络(cnn)在现有医…

实现一个 AI 驱动的马里奥(使用双重深度 Q 网络),它可以自己玩游戏

训练玩马里奥的 RL 智能体 本教程将向您介绍深度强化学习的基础知识。 最后&#xff0c;您将实现一个 AI 驱动的马里奥&#xff08;使用双重深度 Q 网络&#xff09;&#xff0c;它可以自己玩游戏。 # !pip install gym-super-mario-bros7.3.0import torch from torch import …

STM32实现延时

在STM32单片机中&#xff0c;实现延时一般都是使用定时器&#xff0c;既可以使用Systick定时器&#xff0c;也可以使用常规的定时器。 定时器在设置了定时并开启之后&#xff0c;就会进入自主运行模式&#xff0c;其中&#xff0c;初始化设置这一阶段是由CPU执行相应指令完成的…