文件操作:打开、关闭、读取、定位
创始人
2025-05-28 02:35:00

文件的分类:文本文件、二进制文件

        文本文件中,保存的时候一个字符对应一个字节;

        二进制文件,按照二进制编码保存的文件。

  • fopen/fclose函数
  • 从文件中读出
    • fgets 函数
    • fread函数
  • 写入文件
    • fputc函数
    • fwrite函数
  • rewind函数
  • fseek 函数

用 vs 或者 Dev-C++ 使用 fopen等函数时,如果遇到打开不了的情况,例如:

可以在预定义时,在头文件前加上:#define _CRT_SECURE_NO_WARNINGS

fopen/fclose函数

fopen 函数打开文件,执行操作。

文件一旦使用完毕,应该用 fclose 函数把文件关闭,以释放相关资源,避免数据丢失。

不了解函数时,用鼠标点击该函数,按 Fn 键+ F1键。

FILE* fopen (char const* _FileName,char const* _Mode);

语法(filename  文件名、mode  类型)

文件打开:

	FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "r");

 验证是否打开:

	if (fp == NULL)printf("打开失败");

 如果 filename 或 mode 是 NULL 或空字符串,这些函数则会触发无效的参数处理程序,如 Parameter Validation。 如果允许执行继续,则这些函数将返回 NUll 并将 errno 设置为EINVAL。 

 二进制读写:rb、wb、ab、rb+、wb+、ab+. 与上文对应(只不过适用于二进制文件)。

 从文件中读出

	//一个一个输出char ch=0;if (fp != 0){ch=fgetc(fp);printf("%c",ch);ch=fgetc(fp);printf("%c",ch);}
	//循环全部输出while (fp!=0&&EOF!=(ch = fgetc(fp))){printf("%c", ch);}

 fgets 函数

从指定的流中读取数据,每次读取一行。

char *fgets(char *str,int n,FILE *stream);

	//输出文件的第一行,接着输出第二行,同理输出第三行char str[200];if (fp != 0){fgets(str, 200, fp);printf("%s\n", ch);fgets(str, 200, fp);printf("%s\n", 200, fp);}
	char str[200];//循环输出每一行while (fgets(str, 100, fp)){printf("%s", str);}

fread函数(一般读取二进制文件)

从开头读起,读取结束时,文件指针会自动移动到读取结束的地方。

语法 (buffer   数据的存储位置 / size  项目大小,以字节为单位 / count   要读取的项的最大数量 / stream   指向 FILE 结构的指针)

	 //返回实际读取的大小char str[200]={0};int n = fread(str, 1, 20, fp);str[n] = '\0';printf("%s\n", str);
    //按字符个数输入,如果文件里面没有空格,循环结束char str[100] = { 0 };while (fread(str, 1, 100, fp)){printf("%s", str);}

写入文件

	FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "w");

fputc函数——写入字符串

语法( c   要写入的字符 / stream   指向 FILE 结构的指针) 

	//写一个字符,清空之后写FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "w");fputc( 'A',fp );fputc('B', fp);fputc('C', fp);
	char str[] = "sddguerghieruuuuuufhdkhvkshgr";fputs(str, fp);fputs(str, fp);fclose(fp);

fwrite函数

语法( butter   指向要写入的数据的指针/ size   项大小,以字节为单位 / count   要写入的项的最大数量 / stream   指向 FILE 结构的指针)

	int num = 456123;fwrite(&num, sizeof(num), 1, fp);

也可以定义结构体,这样用:

struct node
{char name[10];char sex[10];
};
	struct node p = { "张三","男" };fwrite(&p, 1, sizeof(p), fp);

如果要读写内容的话,可以在打开文件时使用 w+ 或者 r+,但是读完数据之后,不能直接写出来,因为文件的指针(光标)在最后面,此时是写不出来的。

那么就需要重置指针到文件开头,用 rewind 函数。

rewind函数——重置文件指针到文件头

例:

	FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "w+");//存入并输出A-Zfor(int i=0;i<26;i++){int ret=fputc('A'+i,fp);printf("%c",ret);}printf("\n");//接下来接着读取int ch=fgetc(fp);printf("%c",ch);fclose(fp);

按照这个代码的思路是:第一步输出二十六个字母之后,换行,接着第二步读取文件的值,但是第二步没有实现,因为在执行完第一个操作后,文件的指针在最后,再往后走是读不到字符的,此时用 rewind 函数,重置指针,就可以接着从文件头开始读取了。

只需要改一个地方,在第二步开始之前加入:

	rewind(fp);

 fseek 函数

是一个非常方便的文件读取函数,可以设置文件指针到指定位置。

语法( stream   指向 FILE 结构的指针 / offset   origin 中的字节数 / origin   初始位置)

 可以将文件开头数的第十位字符输出

	char str[200] = { 0 };fseek(fp, 10, SEEK_SET);//开头开始读fread(str, 1, 100, fp);printf("%s\n", str);

从指针当前位置倒退十个字符

	char str[100] = { 0 };//初始化fseek(fp, -10, SEEK_CUR);fread(str, 1, 100, fp);printf("%s\n", str);

相关内容

热门资讯

【Android Servic... IntentService 简单使用 /*** Create by SunnyDay /03/13 ...
设计模式-责任链模式 责任链模式属于行为模式Gof定义 使多个对象都有机会处理请求,从而避免请求的发送者和接...
一文带你彻底理解进程与线程(包... 进程与线程 进程 何为进程 进程通俗的说就是我们计算机中一个个正在运行中的程序的抽象出来的概念&#x...
亚马逊国际获得AMAZON商品... item_get-获得AMAZON商品详情item_search-按关键字搜索商品公共参数名称类型必...
redis之动态字符串sds的... 目录 引言: C语言: sds SDS的实现  C语言与SDS对比 1࿰...
【PMP第六章实战】项目进度管... 问题一 如果项目经理对各需求所需的人天不确定,是否需要让懂技术的来一起制定࿱...
「SAP」为什么2023年后A... 💂作者简介: THUNDER王,一名热爱财税和SAP A...
高盛前银行家莱斯纳将因一马发展... 在承认参与史上最大金融丑闻之一近七年后,高盛集团前银行家蒂姆・莱斯纳(Tim Leissner)将于...
拼多多净利润缩水,结果我发现不... 曾经一发财报,就让市场疯狂,股价暴涨,让人忍不住感叹 “ 还有谁能阻挡它” 的拼多多。 却在昨天发布...
蓝牙耳机和运动耳机哪个好、运动... 如果你要买一款运动耳塞,那么你需要注意一些细节,一款好的运动耳塞...
Nginx+Tomcat负载均... 文章目录一.Nginx负载均衡实现原理1、 反向代理原理2、反向代理的概念3、反向代理的优势4、Ng...
STM32之bxCAN CAN基础知识介绍CAN介绍什么是CANCAN(Controller Area Net...
3.15日报 一、WebSocket客户端 websocket允许通过JavaScript建立与远程服务器的连接&...
Web文件下载总结 文章目录location.href 或 window.open标签 或 点击事件a标签的downlo...
VS2017使用Eigen库 在 C++ 中,向量类型通常由库提供。C++ 标准库中...
MySQL-->上篇 一、引言 1.1 现有的数据存储方式有哪些? Java程序存储数据(...
西安石油大学C语言期末真题实战 很简单的一道程序阅读题,p=a’默认为a【0】,接下来会进行3次...
Mybatis框架结构 在学习mybatis之前,首先回忆传统jdbc如何访问数据库。传统jdbc 访问数据库...
“诅咒领导猝死”正在收割第一波... 出品 | 虎嗅青年文化组作者 | 渣渣郡本文首发于虎嗅年轻内容公众号“那個NG”(ID:huxiu4...
消息中间件-1 1、什么是消息中间件? 消息中间件属于分布式系统中一个子系统,主要关注于...
【netron】模型可视化工具... 1、简介 在实际的项目中,经常会遇到各种网络模型,需要我们快速去了解网络...
嵌入式软件开发之Linux下C... 目录 前沿 Hello World! 编写代码 编译代码 GCC编译器  gcc 命...
海盗分金问题的一种解答 欢迎对非前言部分感兴趣的同学与我讨论前言人的一生充满了意外 真的意外有时候我也受某些同学的启发,觉得...
2B产品中心思考 一.背景对于产品中心的一些思考,做下沉淀。对于电商类业务产品是核心基架,...
海外seo如何优化? 海外SEO如何优化?以下是一些常见问题及其解答。 什么是谷歌SEO或Google优化&...
IBMMQ linux版命令创... 1. 队列、通道介绍 1.1 本地队列         本地队列又分为普通本地队列和传输队列...
即时零售点燃白酒市场,美团61... 临近端午假期,不温不火的白酒市场却在线上燃起战火。 图片来源:图虫创意 “没想到618别的还没买,...
信息时代的必修课:信息增量(利... 文章目录 引言I 利用相关性进行压缩编码1.1 增量编码的案例11.2 增量编码的案例21.3 增量...
上海动力设备展:展会设计与搭建... 上海动力设备展作为动力设备发电机组领域极具影响力的品牌展会,是企业展示实力、推广产品、交流技术的理想...
28日中证500指数期货下跌0... 新浪期货 根据交易所数据,截至5月28日收盘主力合约中证500指数期货2506,涨跌-0.26%,成...