嵌入式☞第二组(捌)

C语言基础:

文件操作

概述

什么是 文件
文件时保存在外存储器上(一般代指磁盘,也可以是U盘、移动硬盘等)的数据的集合。
文件操作体现在哪几个方面

  1. 文件内容的读取
  2. 文件内容的写入
    数据的读取和写入可被视为针对文件进行输入和输出的操作,此时数据就像水流一样从外存
    储器流向内存,或者从内存流向外存储器,所以系统形象的称文件操作为文件流。
    C语言程序对文件的操作采用“文件缓冲机制”。就是说在程序中对文件的数据读写并不是直接
    操作文件中的数据,而是系统会为文件在内存中创建“文件缓冲区”,程序对文件的操作,其实是在
    缓冲区进行的。
  • 文件的分类

根据数据的存储方式划分:

  1. 文本文件(ASCII文件)
  2. 二进制文件
  • 文件标识
  1. 文件系统中:路径+文件名,举例: d:/aaa/bbb.txt
  2. C语言程序中:文件指针(文件类型指针),语法: FILE *指针变量名
  • 文件操作的步骤:
  1. 打开文件
  2. 文件处理(读写文件)
  3. 关闭文件

文件的操作

  • 打开文件,让系统为文件创建文件缓冲区;

  • 函数名:fopen

  • 头文件: #include <stdio.h>

  • 函数原型: FILE* fopen(const char *path,const char *mode);

  • 函数功能:打开文件,并为文件创建缓冲区

  • 函数参数:

  • path:目标文件的路径

  • mode:文件打开的方式(读-r、写-w、读写-rw)

  • 返回值:

  • 成功:返回文件指针 File* (缓冲区首地址)

  • 失败:返回NULL

  • 文件关闭,文件使用完毕,一定要记得释放

  • 函数名:fclose

  • 头文件: #include <stdio.h>

  • 函数原型: int fclose(FILE* fp);

  • 函数功能:关闭文件,释放缓冲区

  • 函数参数:

  • fp:已经打开的文件指针

  • 返回值:

  • 成功:返回0

  • 失败:返回EOF(-1)

  • 文件打开与关闭案例

/**
* 文件的打开与关闭
*/
#include <stdio.h>
int main(int argc,char** argv)
{// 在命令行执行./a.out的时候,传递一个需要打开的目标文件的地址if(argc < 2){printf("输入有误,请按照<%s 文件路径>格式输入\n",argv[0]);return -1;}// 根据提供的文件路径,打开文件,mode(r,w,rw)FILE* fp = fopen(argv[1],"r");// 校验文件是否读取成功if(!fp){perror("文件打开失败!");return -1;}puts("文件打开成功!");// 关闭打开的文件int ret = fclose(fp);// 校验文件是否关闭成功(很多时候这一步会省略掉)if(ret == -1){perror("文件关闭失败!");return -1;}puts("文件关闭成功!");return 0;
}    

文件的顺序读写

  • 单字符读取
  • 函数名:fgets
  • 头文件: #include <stdio.h>
  • 函数原型:int fgets(File* fp);
  • 函数功能:从fp代表的文件中获取一个字符
  • 函数参数:
  • fp:我们需要操作的文件的描述
  • 返回值:
  • 成功:返回读取到的字符
  • 失败:或者文件末尾,返回EOF(-1)

方式1:

/**
* 单字符的读取
*/
#include <stdio.h>
int main(int argc,char **argv)
{if(argc < 2){printf("输入有误,请按照<%s 文件路径>格式输入\n",argv[0]);return -1;}// 打开文件FILE* fp = fopen(argv[1],"r");// 非空校验if(!fp){perror("文件打开失败!");return -1;}// 单字符读取文件int re = 0;while(re != -1 && re != '\n'){re = fgetc(fp);printf("%c",re);}printf("\n");// 关闭文件fclose(fp);return 0;
}    

方式2:

/**
* 单字符读取
*/
#include <stdio.h>
int main(int argc,char **argv)
{// 获取外部输入if(argc < 2){printf("输入有误,请按照<%s 文件路径>格式输入\n",argv[0]);return -1;}// 打开文件FILE* fp = fopen(argv[1],"r");if(!fp){perror("文件打开失败!");return -1;}// 读取文件char ch;while((ch = fgetc(fp)) != EOF){printf("%c",ch);}printf("\n");// 关闭文件fclose(fp);return 0;
}    
  • 多字符读取

  • 函数名:fgets()

  • 头文件: #include <stdio.h>

  • 函数原型: har *fgets(char *buf, int size, FILE *fp);

  • 函数功能:从fp代表的文件中获取size -1个字符,放置在buf代表的内存中

  • 函数参数:

  • buf:内存空间首地址用于存放读取的字节

  • size:待读取的字符,实际读取size -1

  • fp:已经打开的文件指针

  • 返回值:

  • 成功:返回buf

  • 失败:文件末尾,返回NULL

案例:

/**
* 多字符读取
*/
#include <stdio.h>
#include <string.h>
int main(int argc,char **argv)
{if(argc < 2){printf("输入有误,请按照<%s 文件路径>格式输入\n",argv[0]);return -1;}FILE* fp = fopen(argv[1],"rw");if(!fp){perror("文件打开失败!");return -1;}// 多字符读取// 创建缓冲区大小char buf[64] = {0};while(fgets(buf,64,fp)!=NULL){printf("%s",buf);// 给buf赋初始值memset(buf,0,sizeof(buf));}printf("\n");fclose(fp);return 0;
}    
  • 单字符写入

  • 函数名:fputc

  • 头文件: #include <stdio.h>

  • 函数原型: int fputc(int c,FILE* fp)

  • 函数功能:向fp代表的文件中写入一个字符c

  • 函数参数:

c:待写入的字符

  • fp:已打开的文件指针
  • 返回值:
  • 成功:返回字符c
  • 失败:返回EOF(-1)

案例:

/**
* 单字符写入
*/
#include <stdio.h>
int main(int argc,char **argv)
{if(argc < 3){printf("输入有误,请按照<%s 文件路径 文本数据>格式输入\n",argv[0]);return -1;}FILE* fp = fopen(argv[1],"w");if(!fp){perror("文件打开失败!");return -1;}// 单字符写入while(*argv[2] != '\0'){// ./a.out file1.txt I_Love_Yourfputc(*argv[2],fp);argv[2]++;// 指针偏移1位}fclose(fp);return 0;
}
  • 多字符写入
  • 函数名:fputs
  • 头文件: #include <stdio.h>
  • 函数原型: int fputs(const char *buf, FILE *fp);
  • 函数功能:向fp代表的文件中写入一个字符数组s
  • 函数参数:
  • s:待写入的字符数组(写入缓冲区)
  • fp:已打开的文件指针
  • 返回值:
  • 成功:返回非负整数 (> 0)
  • 失败:返回EOF(-1)

案例:

/**
* 多字符写入
*/
#include <stdio.h>
int main(int argc,char **argv)
{if(argc < 3){printf("输入有误,请按照<%s 文件路径 文本数据>格式输入\n",argv[0]);return -1;}FILE* fp = fopen(argv[1],"w");if(!fp){perror("文件打开失败!");return -1;}// 单字符写入// ./a.out file1.txt I_Love_Yourfputs(argv[2],fp);fclose(fp);return 0;
}    
  • 判文件结束
  • 函数名: feof(fp)
  • 头文件: #include <stdio.h>
  • 函数原型: int feof(fp)
  • 函数功能:在读fp指向的文件时判断是否遇到文件结束。
  • 函数参数:
  • fp:已打开的文件指针
  • 返回值:
  • 文件未读取完毕:返回0
  • 失败:文件读取完毕:返回非0
  • 练习:实现一个文本文件的拷贝
  • 参考代码:
/**
* feof案例:将一个磁盘文件中的信息复制到另一个磁盘文件中。
*/
#include <stdio.h>
#include <string.h>
int main(int argc,char** argv)
{// main函数输入判断if(argc < 3){printf("输入有误,请按照<%s 源文件路径 目标文件路径>格式输入\n",argv[0]);return -1;}// 打开文件FILE* in = fopen(argv[1],"r");FILE* out = fopen(argv[2],"w");// 校验if(!in || !out){perror("文件打开失败!");return -1;}// 单个字符读写// while(!feof(in))// {// 读写操作// fputc(fgetc(in),out);//}// 多个字符读写// 创建一个缓冲区,用来存放读写的数据char buf[64] = {0};// 使用循环读写文件while(fgets(buf,64,in)!=NULL){// 写入数据fputs(buf,out);// 重置缓冲区memset(buf,0,sizeof(buf));}printf("\n");// 关闭文件fclose(in);fclose(out);
}    
  • 数据块的读写(二进制)
  • fread
  • 头文件: #include <stdio.h>
  • 函数原型: size_t fread(void *ptr,size_t size,size_t count,FILE* fp)
  • 函数功能:从fp代表的文件中以size为单位(一个数据块)读取count个数据块存放在ptr内存
  • 中。
  • 函数参数:
  • ptr:内存空间首地址,用于存放读取到数据(缓冲区)
  • size:数据块大小,以byte为单位
  • count:待读取的数据块的个数
  • fp:已打开的文件指针
  • 返回值:
  • 成功:返回实际写入的字节数??
  • 失败:返回 < 0
  • 案例:
/**
* 数据库读写案例:将二进制文件stu-list中的学生信息读出来。
*/
#include <stdio.h>
#define SIZE 4
// 创建学生结构体
struct Student
{char name[20];int num;int age;char addr[50];// 住址
} stud[SIZE];
void main()
{int i;FILE* fp;if((fp = fopen("stu-list","rb")) == NULL){perror("文件打开失败!");return;}// 循环读取二进制文件for(i = 0; i < SIZE; i++){fread(&stud[i],sizeof(struct Student),1,fp);// 将读到的内容输出到控制台printf("%-10s%4d%4d%-20s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}fclose(fp);
}
  • fwrite

  • 头文件: #include <stdio.h>

  • 函数原型: size_t fwrite(const void* ptr,size_t size,size_t count,FILE* fp)

  • 函数功能:向fp代表的文件中以size为一个数据块,写入count个数据块到fp

  • 函数参数:

  • ptr:内存空间首地址,用于存放待写入的数据,(写入缓冲区)

  • size:数据块大小,以byte为单位

  • count:待写入的数据块个数

  • fp:已打开的文件指针

  • 返回值:

  • 成功:返回实际写入字节数??

  • 失败:写入完毕,返回 < 0

  • 案例:

/**
* 数据库读写案例:从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去。
*/
#include <stdio.h>
#define SIZE 4 // 学生数量
// 创建学生结构体
struct Student
{char name[20];int num;int age;char addr[50];// 住址
} stud[SIZE];
// 保存学生信息到文件
void save()
{FILE* fp;int i;if((fp = fopen("stu-list","wb")) == NULL)// stu-list对应的目录:./stu-list,wb-二进制写入,默认是文本写入{perror("文件打开失败!");return;}// 写入操作for(i = 0; i < SIZE; i++){fwrite(&stud[i],sizeof(struct Student),1,fp);}// 关闭文件fclose(fp);
}
void main()
{int i;printf("请输入学生的信息:姓名,学号,年龄,住址\n");for(i = 0; i < SIZE;i++){scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);// 录入一个学生,就保存一个学生到文件中save();}
}    
  • 文件的随机读写

  • 说明:C语言允许程序员在读写文件内容时,可在指定的位置上读写数据

  • 文件随机读写的核心操作: 文件位置指针的定位

  • 文件位置指针的移动方法:

  • rewind

  • 头文件: #include <stdio.h>

  • 函数原型: void rewind(FILE* fp);

  • 函数功能: 将文件位置指针定位到文件开头

  • 函数参数:

  • fp: 已经打开的文件指针

  • 返回值: 无

  • fseek

  • 头文件: #include <stdio.h>

  • 函数原型: int fseek(FILE *fp, long offset, int whence);

  • 函数功能: 将文件位置指针定位到指定位置

  • 函数参数:

  • fp: 已经打开的文件指针

  • offset: 相对于参考位置的偏移位置

  • whence: 参考位置

  • SEEK_SET 或 0 表示文件头

  • SEEK_CUR 或 1 表示当前读写的位置

  • SEEK_END 或 2 表示文件尾

  • 返回值:

  • 成功 :0

  • 失败 : -1

  • ftell

  • 头文件: #include <stdio.h>

  • 函数原型: long ftell(FILE *fp);

  • 函数功能: 获取文件位置指针当前位置

  • 函数参数:

  • fp: 已经打开的文件指针

  • 返回值:

  • 成功 :文件位置指针当前位置

  • 失败 : -1

  • 案例1:

/**
* 有一个磁盘文件,第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上。
*/
#include <stdio.h>
void main()
{FILE *fp1, *fp2;fp1 = fopen("file1.c", "r");fp2 = fopen("file2.c", "w");while (!feof(fp1))putchar(getc(fp1)); /*输出到屏幕*/rewind(fp1); /*位置指针返回到文件头*/while (!feof(fp1))putc(getc(fp1), fp2); /*从文件file1的头读起,输出到文件file2中*/fclose(fp1);fclose(fp2); /*关闭文件*/
}

案例2:

#include <stdlib.h>
#include <stdio.h>
struct student_type
{char name[10];int num;int age;char sex;
} stud[10];
void main()
{int i;FILE *fp;if ((fp = fopen("stud-dat", "rb")) == NULL){printf("can not open file\n");return;}for (i = 0; i < 10; i += 2){fseek(fp, i * sizeof(struct student_type), 0);fread(&stud[i], sizeof(struct student_type), 1, fp);printf("%s %d %d %c\n", stud[i].name, stud[i].num, stud[i].age, stud[i].sex);}fclose(fp);
}

案例3:

/**
* 下列C程序的功能是,用“追加”的形式打开文件gg.txt,查看文件读写指针的位置,然后向文件写入“data”,
再查看
文件读写指针的位置。
*/
#include "stdio.h"
main()
{long p;FILE *fp;if ((fp = fopen("gg.txt","a")) == NULL){printf("cannot open this file!\n");return;}p = ftell(fp);printf("p=%ld\n",p);fputs("data", fp);p = ftell(fp);printf("p=%ld\n",p);fclose(fp);
}    

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

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

相关文章

Java参数校验(最佳实践)

验证参数 关于JSR-303规范 JSR-303是JAVA EE6中的一项子规范&#xff0c;validation-api是一套标准&#xff08;JSR-303&#xff09;&#xff0c;叫做Bean Validation&#xff0c;Hibernate Validator是Bean Validation的参考实现&#xff0c;提供了JSR-303 规范中所有内置cons…

Spring Security 6如何使用?

Spring Security 6 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;它专注于为基于Java的应用程序提供全面的安全解决方案。以下是对Spring Security 6的详细解析&#xff1a; 一、核心功能 身份验证&#xff08;Authentication&#xff09;&#xff1a; 验…

2024最新50道NLP和人工智能领域面试题+答案(中文+英文双版本)

编者按&#xff1a;分享一个很硬核的免费人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 可以当故事来看&#xff0c;轻松学习。 中文版本 自然语言处理 (NLP)已成为语言学、人工智能和计算机科学交叉领域的变革性领域。随着文本数据量的不断增加&…

树莓派5 笔记26:ollama大型语言模型_中文输入法_Python_espeak文字转语音

今日继续学习树莓派5 8G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下&#xff1a; 下载大语言模型&#xff0c;下载中文输入法&#…

遗传算法原理与实战(python、matlab)

遗传算法 1.什么是遗传算法 遗传算法&#xff08;Genetic Algorithm&#xff0c;简称GA&#xff09;是一种基于生物进化论和遗传学原理的全局优化搜索算法。它通过模拟自然界中生物种群的遗传机制和进化过程来解决复杂问题&#xff0c;如函数优化、组合优化、机器学习等。遗传…

Anki如何安装插件

文章目录 前言如何安装 Anki 插件开始安装如何获取插件代码安装成功 前言 如果需要扩展 Anki 可能就需要安装一些插件。 这里介绍如何安装插件。 如何安装 Anki 插件 当下载完 anki 后打开软件。 开始安装 点击上面的工具栏&#xff0c;然后点击插件。 这时候会跳出新的弹…

【esp32程序编译提示undefined reference to ‘xxxx‘】

案例1&#xff1a; 【背景】 在使用SquareLine Studio设计UI时&#xff0c;成功导出UI代码&#xff0c;在编译代码的时候提示undefined reference to ‘ui_img_1869164015’&#xff0c;有一个变量无法识别&#xff0c;没有定义。 【定位步骤】 1.首先找到用这个变量的.c文件…

spring中事务介绍

shttps://download.csdn.net/blog/column/12302624/131993937 spring中事务介绍&#xff0c;参考链接如上

Vue3+ElementUI中的Table组件的使用

Vue3ElementUI中的Table组件的使用 校验表格内多个输入框校验 表格滚动到底部 校验 表格内多个输入框校验 注意prop如何写。实现&#xff1a;一旦输入框内部有更改&#xff0c;清空校验&#xff1b;实现&#xff1a;自定义校验错误提示信息样式&#xff1b;实现&#xff1a;在…

html文件运行后界面反馈xxx拒绝连接

概述&#xff1a;我的html代码中包含了外站界面&#xff0c;运行后界面反馈到xxx拒绝连接&#xff0c;我尝试了网上的诸多方法&#xff0c;例如换一个浏览器运行&#xff0c;修改主机网络设置&#xff0c;更改浏览器DNS都没有作用。 <!DOCTYPE html> <html> <h…

MySQL数据库专栏(三)数据库服务维护操作

1、界面维护&#xff0c;打开服务窗口找到MySQL服务&#xff0c;右键单击可对服务进行启动、停止、重启等操作。 选择属性&#xff0c;还可以设置启动类型为自动、手动、禁用。 2、指令维护 卸载服务&#xff1a;sc delete [服务名称] 例如&#xff1a;sc delete MySQL 启动服…

REF_PIN_NAME

REF_PIN_NAME是设计中引脚上的只读属性&#xff0c;表示一个逻辑名称 唯一标识该引脚。 该属性由引脚的名称或层次名称自动定义&#xff0c; 并且不能由用户在HDL或XDC中修改。仅供参考。 该属性不影响任何步骤&#xff0c;但在定义过滤器和其他方面非常有用 Vivado Tcl命令查询…

实验五之用Processing绘画

1.案例代码如下&#xff1a; import generativedesign.*; import processing.pdf.*; import java.util.Calendar; Tablet tablet; boolean recordPDF false; float x 0, y 0; float stepSize 5.0; PFont font; String letters "Sie hren nicht die folgenden Gesnge…

灵神题单——定长滑动窗口

滑动窗口 1343&#xff1a;大小为k且平均值大于等于阈值的子数组数目 class Solution { public:int numOfSubarrays(vector<int>& arr, int k, int threshold) { int ant0;int q[100005],hh0,tt-1;int sum0;for(int i0;i<arr.size();i){if(hh<tt&&i-…

解决方案上新了丨趋动科技推出基于银河麒麟操作系统的异构算力池化解决方案

趋动科技携手麒麟软件打造基于银河麒麟操作系统的异构算力池化解决方案&#xff0c;共同探索AI领域新场景。 人工智能技术作为数字经济发展的重要推手&#xff0c;在各行业业务场景中落地需要大量AI算力资源的有效保障。在IT基础设施普遍云化的今天&#xff0c;AI算力一方面需…

CDN劫持总结

CDN劫持是指黑客通过各种手段&#xff0c;如DNS缓存污染、中间人攻击等&#xff0c;对内容分发网络&#xff08;CDN&#xff09;进行非法控制&#xff0c;导致用户访问被重定向至恶意服务器&#xff0c;从而遭受数据泄露或恶意软件感染的风险。 一、CDN劫持的定义与影响 定义…

【Python】APScheduler:Python中强大的任务调度库

我听见有人猜 你是敌人潜伏的内线 和你相知多年 我确信对你的了解 你舍命救我画面 一一在眼前浮现 司空见惯了鲜血 你忘记你本是娇娆的红颜 感觉你我彼此都那么依恋 &#x1f3b5; 许嵩《内线》 在 Python 开发中&#xff0c;定时任务是非常常见的需求&am…

AI学习记录 - transformers 的 linear 词映射层的详细分析, CrossEntropyLoss 函数解析

创作不易&#xff0c;有用的话点个赞。。。。。。 1. 假设条件 词汇表&#xff1a;假设词汇表包含四个词汇&#xff1a;[token_0, token_1, token_2, token_3]。 模型的输出概率分布&#xff1a;模型的输出经过 Softmax 转换后&#xff0c;得到概率分布&#xff1a;[0.1,0.5,…

88.SAPUI5 Model Binding的问题-在view更改数据,model却不变

目录 1.背景 2.sap.ui.model.BindingMode sap.ui.model.BindingMode.OneWay sap.ui.model.BindingMode.TwoWay 3.oModel.setDefaultBindingMode 方法说明 execOneWay方法 execTwoWay方法 1.背景 在做一个UI5项目&#xff0c;后台读取sap.ui.model.Model后&#xff0c;把…

qt-12工具盒(ToolBox)

工具盒--ToolBox drawer.hdrawer.cppmain.cpp运行图 drawer.h #ifndef DRAWER_H #define DRAWER_H #include <QWidget> #include <QToolBox> #include <QToolButton> #include <QGroupBox> #include <QVBoxLayout>class Drawer : public QToolB…