专业课笔记——(第十二章:文件的读写)

目录

一、文件概述

1.存储角度

2.文件类型

3.文件操作流程

二、文件的基本操作

1.文件的使用模式

2.文件字符形式的输入输出

3.文件字符串形式的输入输出 

4.文件格式化形式的输入输出

5.文件数据块形式的输入输出

6.文件的随机读写


一、文件概述

1.存储角度

文件存取方式分为:顺序存取方式、随机存取方式。

  • 顺序存取就是从上往下,一笔一笔读取文件的内容。写入数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件。
  • 随机存取方式多半以二进制文件为主。它会以一个完整的单位来进行数据的读取和写入,通常以结构为单位。

2.文件类型

文件类型分为:文本文件和二进制文件

  • 文本文件是以字符编码的方式进行保存的。
  • 二进制文件将内存中的数据原封不动的进行保存,适用于非字符为主的数据。

3.文件操作流程

建立/打开文件——从文件中读取数据或向文件中写数据——关闭文件

  • 当一个文件不存在时,如果是读操作,则会报错。
  • 当一个文件不存在时,如果是写操作,则会自动创建这个文件。
  • 文件打开和关闭是成套的,当结束使用之后一定要关闭文件,
#include <stdio.h>  
#include <stdlib.h> // 为了使用EXIT_FAILURE  int main()  
{  FILE *p = fopen("/tmp/1.txt", "r");  if (p == NULL)  {  printf("open error!\n");  return 0:}  fclose(p); // 成功打开文件后关闭它  return 0; // 程序成功执行  
}

二、文件的基本操作

1.文件的使用模式

1、“r”(只读):从文件头开始

  • 文本文件需存在,如不存在则报错。

2、“r+”(读写):从文件头开始

  • 文本文件需存在,如不存在则报错。

3、“w”(只写):从文件头开始

  • 文本文件不存在则创建新文件,存在则清空原有内容。

4、“w+”(读写):从文件头开始

  • 文本文件不存在则创建新文件,存在则清空原有内容。

5、“a”(追加)(读写):从文件尾开始

  • 文本文件不存在进行创建新文件,存在则在末尾追加。

6、“a+” (追加)(读写):从文件头读取,从文件尾写入

  • 文本文件不存在进行创建新文件,存在则在末尾追加。

二进制使用模式同上面所示,唯一就是在后面加上“b”即可,如下所示:

1、“rb”(只读):从文件头开始

  • 二进制文件需存在,如不存在则报错。

2、........均类比如上

2.文件字符形式的输入输出

1、函数fgetc()、fputc()

  • fgetc(fp_read):从fp指向的文件读入一个字符,若失败返回EOR即-1。
  • fputc(ch, fp_write):将字符ch写到fp指向的文件,若失败返回EOR即-1。
#include <stdio.h>  
#include <stdlib.h>  int main() {  FILE *fp_read, *fp_write;  char ch, fir_name[40], sec_name[40];  printf("请输入被复制的文件名: ");  scanf("%s", fir_name);  printf("请输入新的文件名: ");  scanf("%s", sec_name);  // 打开源文件进行读取  if (!(fp_read = fopen(fir_name, "r"))) {  printf("Cannot open the file %s!\n", fir_name);  return 1; // 返回非零值表示错误  }  // 打开目标文件进行写入  if (!(fp_write = fopen(sec_name, "w"))) {  printf("Cannot open the file %s!\n", sec_name);  fclose(fp_read); // 发生错误时关闭已打开的源文件  return 1; // 返回非零值表示错误  }  // 逐字符读取源文件并写入目标文件  while ((ch = fgetc(fp_read)) != EOF) {  fputc(ch, fp_write);  }  printf("Copy complete!\n");  // 关闭文件  fclose(fp_read);  fclose(fp_write);  return 0; // 程序正常结束  
}

3.文件字符串形式的输入输出 

1、函数fgetc()、fputc()

  • fgets(str, 100, fp_read):从fp指向的文件读入长度(100-1)字符并保存在str字符数组中,若失败返回NULL。
  • fputs(str, fp_write):将tr字符数组内容写入fp_write指向的目标文件 ,成功返回0,若失败返回非0值。
#include <stdio.h>  
#include <stdlib.h>  int main() {  FILE *fp_read, *fp_write;  char str[100]; // 增加缓冲区大小,以便能够读取更长的行  // 打开源文件进行读取  if (!(fp_read = fopen("text.txt", "r"))) { // 注意修正双引号的使用  printf("Cannot open the file text.txt!\n");  return 1; // 返回非零值表示错误  }  // 打开目标文件进行写入(假设目标文件名为 copy.txt)  if (!(fp_write = fopen("copy.txt", "w"))) { printf("Cannot open the file copy.txt!\n");  fclose(fp_read); //发生错误时关闭已打开的源文件  return 1; // 返回非零值表示错误  }  // 逐行读取源文件并写入目标文件  while (fgets(str, 100, fp_read)) { // 注意 fgets 函数的调用方式  printf("%s", str);  fputs(str, fp_write); // 将读取的内容写入fp_write指向的目标文件  }  printf("Copy complete!\n");  // 关闭文件  fclose(fp_read);  fclose(fp_write);  return 0; // 程序正常结束  
}

4.文件格式化形式的输入输出

1、函数fscanf()、fprintf()(不建议用,推荐使用fread和fwrite)

  • fscanf(fp,格式串,输入项表):从文本文件中按格式输入数据,成功时,返回成功匹配并赋值的输入项数;如果到达文件末尾或发生读取错误,则可能返回EOF。
  • fprintf(fp,格式串,输出项表):按格式输出数据到文本文件中。
#include <stdio.h>
#include <string.h>int main()
{FILE *file = fopen("./1.txt", "r");if(file == NULL){printf("open error!\n");return 0;}FILE *fp = fopen("./2.txt", "w");char buf[1024] = {0};fscanf(file, "%s", buf);fprintf(fp, "aaa:%s", buf);fclose(file);fclose(fp);return 0;
}

5.文件数据块形式的输入输出

1、函数read(buffer,size,count,fo)、fwrite(buffer,size,count,fp):

2、buffer:是一个地址。(起始地址)

  • 对fread来说:用来存放文件读入的数据的存储区的地址;
  • 对fwrite来说:把此地址开始的存储区中的数据向文件输出。

3、size:要读写的字节数。
4、count:要读写多少个数据项。(每个数据项长度为size)
5、fp:FILE 类型指针
注意:数据块输入输出函数只适合于二进制文件

#include <stdio.h>  
#define SIZE 10  struct student {  char name[20];  int num;  int age; char addr[20];  
} stu[SIZE];  int main() {  int i;  FILE *fp_read, *fp_write;  if (!(fp_read = fopen("data stu.dat", "rb"))) {  printf("Cannot open the file data stu.dat!\n");return 0; }  if (!(fp_write = fopen("datal stu.dat", "wb"))) {   printf("Cannot open the file datal stu.dat!\n");  fclose(fp_read); //发生错误时关闭已打开的源文件  return 0; }  for (i = 0; i < SIZE; i++) {  if (fread(&stu[i], sizeof(struct student), 1, fp_read) != 1) {  printf("File read error\n"); fclose(fp_read);  fclose(fp_write);  return 0; }  printf("Name: %s, Num: %d, Age: %d, Addr: %s\n", stu[i].name, stu[i].num, stu[i].age, stu[i].addr);  if (fwrite(&stu[i], sizeof(struct student), 1, fp_write) != 1) {  printf("File write error\n"); fclose(fp_read);  fclose(fp_write);  return 0; }  }  printf("Successful storage!\n"); fclose(fp_read); fclose(fp_write);  return 1;  
}

6.文件的随机读写

1、文件的随机读写:指定想要读写的文件位置。

2、rewind(fp)函数

  • rewind():函数使文件文件位置标记指向文件开头。
  • rewind(pf)

3、fseek(fp,位移量,起始点):改变文件位置标记

  • 文件起始点含义如下:
文件开头 SEEK_SET = 0
当前位置 SEEK_CUR = 1
文件结尾 SEEK_END = 2
  • 位移量:这个值可以是正数、负数或零。正数表示向前移动(远离文件开头),负数表示向后移动(朝向文件开头),零则不移动位置但可以用来重新定位起始点。
fseek(fp,100L,0);//将文件位置标记向前移到离文件开头100个字节处
fseek(fp,50L,1); //将文件位置标记前移到离当前位置50个字节处
fseek(fp,-10L,2);//将文件位置标记从文件末尾处向后退10个字节

4、代码实现

#include <stdio.h>  #define SIZE 10  // 定义学生结构体  
struct student {  char name[20];  int num;  int age;  char addr[20];  
};stu[SIZE]; int main() {  FILE *fp_read, *fp_write;  int i;  // 打开文件以写入,注意文件名和模式  if (!(fp_write = fopen("data_stu.txt", "wb"))) {  printf("Cannot open the file data_stu.txt for writing!\n");  return 1;  }  // 打开文件以读取  if (!(fp_read = fopen("data_stu.dat", "rb"))) {  printf("Cannot open the file data_stu.dat for reading!\n");  fclose(fp_write); // 关闭已打开的文件  return 1;  }  printf("Name\tNum\tAge\tAddr\n");  for (i = 0; i < SIZE; i += 2) { fseek(fp_read,i*sizeof(struct student),0);fread(&stu[i], sizeof(struct student), 1, fp_read);fwrite(&stu[i], sizeof(struct student), 1, fp_write); printf("%s\t%d\t%d\t%s\n", stu[i].name, stu[i].num, stu[i].age, stu[i].addr);    }  fclose(fp_read);  fclose(fp_write);  printf("Successful storage!\n");  return 0; // 成功返回0  
}

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

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

相关文章

LLM - 神经网络的训练过程

1. 对于回归问题&#xff0c;用损失函数来计算预测值和真实值的差异&#xff0c;一种常用的公式是如下图所示(Mean Square Error)&#xff0c;如果损失函数的值越小说明神经网络学习越准确&#xff0c;所以神经网络训练目标是减小损失函数的值&#xff0c; 2. 对于分类问题&…

并发、多线程和HTTP连接之间有什么关系?

一、并发的概念 并发是系统同时处理多个任务或事件的能力。在计算中&#xff0c;这意味着系统能够在同一时间段内处理多个任务&#xff0c;而不是严格按照顺序一个接一个地执行它们。并发提高了系统的效率和资源利用率&#xff0c;从而更好地满足用户的需求。在现代应用程序中&…

SwiftUI中List的liststyle样式及使用详解添加、移动、删除、自定义滑动

SwiftUI中的List可是个好东西&#xff0c;它用于显示可滚动列表的视图容器&#xff0c;类似于UITableView。在List中可以显示静态或动态的数据&#xff0c;并支持垂直滚动。List是一个数据驱动的视图&#xff0c;当数据发生变化时&#xff0c;列表会自动更新。针对List&#xf…

神领物流项目第一天

文章目录 聚焦快递领域首先第一个是验证码模块流程登录接口权限管家 聚焦快递领域 首先第一个是验证码模块流程 首先生成验证码的流程 可以使用工具类去生成验证码 LineCaptcha lineCaptcha CaptchaUtil.createLineCaptcha(160, 60, 4, 26);// 获取值然后存入redis中 strin…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十二)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 32 节&#xff09; P32《31.通知-基础通知》 基础文本类型通知&#xff1a;briefText 没有用&#xff0c;写了也白写。 长文本类型…

【东奥会计-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

elasticsearch-users和elasticsearch-reset-password介绍

elasticsearch 内置 elastic, kibana, logstash_system,beats_system 共4个用户&#xff0c;用途如下&#xff1a; elastic 账号&#xff1a;内置的超级用户&#xff0c;拥有 superuser 角色。 kibana 账号&#xff1a;用来连接 elasticsearch 并与之通信。Kibana 服务器以该用…

【HICE】基于用户认证的虚拟服务搭建

1.创建特定的内容 --账号与密码&#xff08;需要认证访问&#xff09;【里面】 2.编辑配置1.conf的内容&#xff0c;更新httpd 3.编辑hehe网页&#xff08;外部公开&#xff09; cd /www/ echo hehe > hehe/index.html 4.更改本地hosts和window下的解析 5.浏览器下验证内…

【嵌入式开发 Linux 常用命令系列 1.5 -- grep 过滤特定类型文件】

请阅读【嵌入式开发学习必备专栏 】 文章目录 grep 过滤特定类型文件 grep 过滤特定类型文件 在Linux中使用grep搜索字符串时&#xff0c;如果你想排除特定类型的文件&#xff0c;比如 .map 和 .py 文件&#xff0c;可以使用grep的--exclude选项。这个选项允许你定义一个或多个…

OpenCV基础(1)

目录 安装OpenCV 读取图像 显示图像 cv2.waitKey()函数 cv2.destroyAllWindows()函数 保存图像 读取视频 开启摄像头 图像处理 像素处理 二值图像及灰度图像 彩色图像及通道处理 调整图像大小 感兴趣区域 掩模 掩模基础及构造 掩模作为函数参数 色彩处理 色…

2024 (ICPC) Jiangxi Provincial Contest(VP补题记录)

2024 (ICPC) Jiangxi Provincial Contest(VP补题记录) 已ac 8/12&#xff0c;赛时7题&#xff0c;赛后1题。 文章目录 2024 (ICPC) Jiangxi Provincial Contest(VP补题记录)A(签到中的签到&#xff0c;pass)C(简单思维)GJ(按题意模拟即可)KH(卷积加权和反过来看)L. CampusD. M…

Java中的大数据处理与分析技术

Java中的大数据处理与分析技术 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 随着数据量的爆炸式增长&#xff0c;大数据处理和分析成为当今软件开发领域中的…

CSRF漏洞攻击

05-CSRF 1 CSRF概述 1.1 概述 CSRF (Cross-Site Request Forgery) 跨站请求伪造&#xff0c;也可称为一键式攻击 (one-click-attack)&#xff0c;通常缩写为 CSRF 或者 XSRF。 CSRF 攻击是一种挟持用户在当前已登录的浏览器上发送恶意请求的攻击方法。相对于XSS利用用户对指…

wsl安装Linux系统到指定位置

默认情况下,wsl安装的系统,会安装到系统C盘,长期下去,很容易把C盘的空间消耗完,从而影响系统的正常运行,所以我建议是将wsl所有的系统都安装到其它磁盘中,便于维护。 1、导出镜像 通过wsl -l -v 查看当前已安装的系统版本。 导出到当前目录位置,也可以指定目录位置。 w…

docker集群部署主从mysql

搭建一个mysql集群&#xff0c;1主2从&#xff0c;使用docker容器 一、创建docker的mysql镜像 下次补上&#xff0c;因为现在很多网络不能直接pull&#xff0c;操作下次补上。 二、创建mysql容器 创建容器1 docker run -it -d --name mysql_1 -p 7001:3306 --net mynet --…

【单链表】03 设L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux算法题上机准备 &#x1f618;欢迎 ❤️关注 &#x1f44d;点赞 &#x1f64c;收藏 ✍️留言 题目 设L为带头结点的单链表&#xff0c;编写算法实现从尾到头反向输出每个结点的值。 算法…

《昇思25天学习打卡营第10天|使用静态图加速》

文章目录 今日所学&#xff1a;一、背景介绍1. 动态图模式2. 静态图模式 三、静态图模式的使用场景四、静态图模式开启方式1. 基于装饰器的开启方式2. 基于context的开启方式 总结&#xff1a; 今日所学&#xff1a; 在上一集中&#xff0c;我学习了保存与加载的方法&#xff…

昇思25天学习打卡营第6天|简单的深度学习模型实战 - 函数式自动微分

自动微分(Automatic Differentiation)是什么&#xff1f;微分是函数在某一处的导数值&#xff0c;自动微分就是使用计算机程序自动求解函数在某一处的导数值。自动微分可用于计算神经网络反向传播的梯度大小&#xff0c;是机器学习训练中不可或缺的一步。 这些公式难免让人头大…

论文浅尝 | 从最少到最多的提示可在大型语言模型中实现复杂的推理

笔记整理&#xff1a;王泽元&#xff0c;浙江大学博士 链接&#xff1a;https://openreview.net/forum?idWZH7099tgfM 1. 动机 尽管深度学习已经取得了巨大的成功&#xff0c;但它与人类智慧仍然存在一些明显差距。这些差距包括以下几个方面&#xff1a;1&#xff09;学习新任…

SQL Server查看所有的数据库、所有的表 以及表的描述

文章目录 -- 查看所有的数据库 select name from sys.databases order by name;-- 查看所有的表 use [你的数据库名]; -- select * from sys.objects order by type; -- select * from sys.objects where type u; -- select object_id,name from sys.objects where type u; s…