C文件操作

目录

文件:

什么是文件

程序文件:

数据文件

 文件操作理解:

 文件名

文件的打开和关闭

文件指针

文件的打开和关闭

文件的使用方式:

文件的读写:

 ​编辑

fputc

​编辑fgetc

 fputs

fgets

perror

fprintf

​编辑

fscanf

​编辑

流:

fwrite

fread

对比函数:

 sscanf

sprintf

文件的随机读写

fseek

ftell

rewind


文件:

什么是文件

磁盘上的文件是文件。

程序文件:

 源文件,目标文件和可执行程序是程序文件。

数据文件

文件的内容是程序运行时读写的数据。

 文件操作理解:

文件操作就是在程序中对硬盘上的文件进行写(输出)和读(输入)。

文件操作:我们通过文件指针找到对应文件信息,并对文件进行处理

 文件名

 文件名的组成:文件路径加上文件名。

文件的打开和关闭

文件指针

当打开一个文件时,硬盘上的文件会在内存中开辟对应的文件信息区,文件信息区存储的是该文件的数据,文件信息区定义形如:

struct _iobuf{char* _ptr;int _cnt;char*_base;int _flag;int _file;int _charbuf;int _bufsiz;char* _tmpfname;
};
typedef struct _iobuf FILE;

 一个结构体,上面存储了该文件的全部数据和信息。

这个结构体类型是FILE。

结构体指针就是FILE*,指向该文件信息区。

我们通过文件指针FILE*可以找到对应文件完成文件操作。

文件的打开和关闭

fopen:打开文件

以什么方式打开哪一个文件。 

fclose:关闭文件

#include<string.h>
#include<errno.h>
#include<stdio.h>int main()
{FILE*pf = fopen("test.txt", "r");//以读的形式打开文件test.txtif (pf == NULL)//文件读取失败时返回空指针{printf("%s\n", strerror(errno));//打印错误信息return 1;}//...//读文件fclose(pf);//关闭文件pf = NULL;//防止后续操作对文件指针进行修改。return 0;
}

读取文件时,文件必须存在。

读取其他路径下的文件:

FILE*pf = fopen("C:\\Users\\13902\\Desktop", "r");//读其他路径下的文件需要加上'\'进行传义

文件的使用方式:

文件的读写:

 

fputc

表示把字符写入到文件流中去。

fgetc

 从文件中读取一个字符。

int main()
{FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义if (pf == NULL)//文件读取失败时返回空指针{printf("%s\n", strerror(errno));//打印错误信息return 1;}//...//读文件/*char i = 0;for (i = 'a'; i <'z'; i++){fputc(i, pf);}*/char ch = fgetc(pf);cout << ch << endl;fclose(pf);//关闭文件pf = NULL;//防止后续操作对文件指针进行修改。return 0;
}

fgetc函数表示从文件中读取一个字符,读取成功时,返回该字符,读取失败是,返回EOF。

 fputs

写一行数据到文件中。

int main()
{FILE*pf = fopen("test.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//...//读文件/*char i = 0;for (i = 'a'; i <'z'; i++){fputc(i, pf);}*//*char ch = fgetc(pf);cout << ch << endl;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}*/fputs("zhanmusi ", pf);fclose(pf);pf = NULL;return 0;
}

fgets

从文件中读一行数据。

int main()
{FILE*pf = fopen("test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//...//读文件/*char i = 0;for (i = 'a'; i <'z'; i++){fputc(i, pf);}*//*char ch = fgetc(pf);cout << ch << endl;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}*/char arr[20] = { 0 };fgets(arr, 20, pf);cout << arr << endl;fclose(pf);pf = NULL;return 0;
}

perror

代替strerror,作用是打印错误信息。

 

fprintf

写格式化数据到文件。

struct S
{char arr[10];int age;float score;
};
int main()
{struct S s = { "zhangsan", 25, 50 };  FILE*pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}fprintf(pf,"%s %d %f",s.arr,s.age,s.score);fclose(pf);pf = NULL;return 0;
}

fscanf

表示从文件中读取格式化数据

struct S
{char arr[10];int age;float score;
};
int main()
{struct S s = { 0 };  FILE*pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}fscanf(pf, "%s %d %f", s.arr, &s.age, &s.score);fclose(pf);pf = NULL;return 0;
}

流:

流是实现内存向不同外设输入数据时因外设的输入方式不同而创建的,类比接口。

我们只需要把内存中的数据输入给流,流来自动把数据输出给外设。

fwrite

把数据以二进位制形式写到文件。

struct S
{char arr[10];int age;float score;
};
int main()
{struct S s = { "zhangsan", 25, 50 };FILE*pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}/*fscanf(pf, "%s %d %f", s.arr, &s.age, &s.score);fprintf(stdout, "%s %d %f", s.arr, s.age, s.score);*/fwrite(&s, sizeof(s), 1, pf);fclose(pf);pf = NULL;return 0;
}

fread

从文件中以二进位制的形式读取。

struct S
{char arr[10];int age;float score;
};
int main()
{struct S s = { };FILE*pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}/*fscanf(pf, "%s %d %f", s.arr, &s.age, &s.score);fprintf(stdout, "%s %d %f", s.arr, s.age, s.score);*//*fwrite(&s, sizeof(s), 1, pf);*/fread(&s, sizeof(s), 1, pf);printf("%s %d %f", s.arr, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

对比函数:

 sscanf

从字符串中读格式化数据。

 本质上是把字符串转换为格式化数据

struct S
{char arr[10];int age;float score;
};
int main()
{struct S s = { "zhangsan", 25, 50 };struct S tmp = { 0 };char arr[100] = { 0 };sprintf(arr, "%s %d %f", s.arr, s.age, s.score);sscanf(arr, "%s %d %f", tmp.arr, &tmp.age, &tmp.score);/*cout << tmp << endl;*/printf("%s %d %f", tmp.arr, tmp.age, tmp.score);/*cout << arr << endl;*/return 0;
}

sprintf

写格式化数据到字符串(把格式化数据转换为字符串)

struct S
{char arr[10];int age;float score;
};
int main()
{struct S s = { "zhangsan", 25, 50 };char arr[100] = { 0 };sprintf(arr, "%s %d %f", s.arr, s.age, s.score);cout << arr << endl;return 0;
}

文件的随机读写

fseek

根据文件指针的位置和偏移量来定位文件指针。

orign有三个取值,分别代表开头,目前,末尾。

int main()
{FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义if (pf == NULL)//文件读取失败时返回空指针{printf("%s\n", strerror(errno));//打印错误信息return 1;}//...//读文件/*char i = 0;for (i = 'a'; i <'z'; i++){fputc(i, pf);}*/fseek(pf, 2, SEEK_SET);char ch = fgetc(pf);cout << ch << endl;fclose(pf);//关闭文件pf = NULL;//防止后续操作对文件指针进行修改。return 0;
}

ftell

返回文件指针相对于起始位置的偏移量。

int main()
{FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义if (pf == NULL)//文件读取失败时返回空指针{printf("%s\n", strerror(errno));//打印错误信息return 1;}//...//读文件/*char i = 0;for (i = 'a'; i <'z'; i++){fputc(i, pf);}*/fseek(pf, 2, SEEK_SET);/*char ch = fgetc(pf);cout << ch << endl;*/int a = ftell(pf);cout << a << endl;fclose(pf);//关闭文件pf = NULL;//防止后续操作对文件指针进行修改。return 0;
}

rewind

让文件指针的位置回到起始位置。

int main()
{FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义if (pf == NULL)//文件读取失败时返回空指针{printf("%s\n", strerror(errno));//打印错误信息return 1;}//...//读文件/*char i = 0;for (i = 'a'; i <'z'; i++){fputc(i, pf);}*/fseek(pf, 2, SEEK_SET);/*char ch = fgetc(pf);cout << ch << endl;*/int a = ftell(pf);cout << a << endl;rewind(pf);char ch = fgetc(pf);cout << ch;fclose(pf);//关闭文件pf = NULL;//防止后续操作对文件指针进行修改。return 0;
}

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

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

相关文章

LLMs 蒸馏, 量化精度, 剪枝 模型优化以用于部署 Model optimizations for deployment

现在&#xff0c;您已经了解了如何调整和对齐大型语言模型以适应您的任务&#xff0c;让我们讨论一下将模型集成到应用程序中需要考虑的事项。 在这个阶段有许多重要的问题需要问。第一组问题与您的LLM在部署中的功能有关。您需要模型生成完成的速度有多快&#xff1f;您有多…

WebDAV之π-Disk派盘 + 咕咚云图

咕咚云图是一款强大的图床传图软件,它能够让您高效地对手机中的各种图片进行github传输,多个平台快速编码上传,支持远程删除不需要的图片,传输过程安全稳定,让您可以很好的进行玩机或者其他操作。 可帮你上传手机图片到图床上,并生成 markdown 链接,支持七牛云、阿里云…

上班第一天同事让我下载个小乌龟,我就去百度小乌龟。。。。

记得那会儿是刚毕业&#xff0c;去上班第一天&#xff0c;管我的那个上级说让我下载个小乌龟&#xff0c;等下把代码拉一下&#xff0c;我那是一脸懵逼啊&#xff0c;我在学校只学过git啊&#xff0c;然后开始磨磨蹭蹭吭吭哧哧的不知所措&#xff0c;之后我想也许百度能救我&am…

Python教程:方法重载

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 方法重载 方法重载在Python中起着关键作用。 方法有时接受零参数&#xff0c;有时接受一个或多个参数。 当我们以不同的方式调用同一个方法时&#xff0c;这就被称为方法…

JVM 参数

JVM 参数类型大致分为以下几类&#xff1a; 标准参数&#xff08;-&#xff09;&#xff1a;保证在所有的 JVM 实现都支持的参数非标准参数&#xff08;-X&#xff09;&#xff1a;通用的&#xff0c;特定于 HotSpot 虚拟机的参数&#xff0c;这些参数不保证在所有 JVM 实现中…

缓存雪崩、缓存穿透和缓存击穿产生的原因及解决方案

目录 什么是缓存雪崩&#xff1f; 缓存雪崩的解决方案 什么是缓存穿透&#xff1f; 缓存穿透的解决方案 什么是缓存击穿&#xff1f; 缓存击穿的解决方案 缓存在提高系统性能和响应速度方面起着关键作用&#xff0c;但在实际应用中&#xff0c;我们常常面临一些与缓存相…

leetCode 718.最长重复子数组 动态规划 + 优化(滚动数组)

718. 最长重复子数组 - 力扣&#xff08;LeetCode&#xff09; 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&…

2023-2024年华为ICT网络赛道模拟题库

2023-2024年网络赛道模拟题库上线啦&#xff0c;全面覆盖网络&#xff0c;安全&#xff0c;vlan考点&#xff0c;都是带有解析 参赛对象及要求&#xff1a; 参赛对象&#xff1a;现有华为ICT学院及未来有意愿成为华为ICT学院的本科及高职院校在校学生。 参赛要求&#xff1a…

【Spring MVC研究】MVC如何浏览器请求(service方法)

文章目录 1. DispatcherServlet 的 service 方法1.1. processRequest 方法1.2. doService 方法 背景&#xff1a;平时我们学习 MVC 重点关注的时DispatcherServlet 的 doDispatcher 方法&#xff0c;但是在 doDispatcher 方法之前 还有请求处理的前置过程&#xff0c;这个过程…

electron.js入门-为生产环境构建应用程序

在本章中&#xff0c;我们将学习如何使用可执行文件生成生产应用程序&#xff1b;为此&#xff0c;我们将使用以下软件包&#xff1a; https://www.electron.build/ 需要注意的是&#xff0c;当您有兴趣生成应用程序的可执行文件时&#xff0c;必须在每个Electron.js项目中安装…

linux centos Python + Selenium+Chrome自动化测试环境搭建?

在 CentOS 系统上搭建 Python Selenium Chrome 自动化测试环境&#xff0c;需要执行以下步骤&#xff1a; 1、安装 Python CentOS 7 自带的 Python 版本较老&#xff0c;建议使用 EPEL 库或源码安装 Python 3。例如&#xff0c;使用 EPEL 库安装 Python 3&#xff1a; sud…

Java 线程的生命周期

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…