IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c语言学习记录——文件操作 -> 正文阅读

[C++知识库]c语言学习记录——文件操作

1什么是文件

磁盘上的文件就是文件

文件分两种:

程序文件:

  • 包括源程序文件(.c)、目标文件(.obj)、可执行程序(.exe)

数据文件:

  • 文件的内容不一定是程序,而是程序运行时读写的数据。比如程序运行时需要从中读取数据的文件,或者输出内容的文件。

(此前数据的输入输出都是以终端为对象,键盘输入,显示屏输出。其实有时我们会把信息输出到磁盘上,当需要的时候再在磁盘上读取到内存中使用。)

2文件名

文件要有一个唯一的文件标识,以便用户识别使用。

文件名包含3个部分:文件路径+文件名主干+文件后缀

为了方便文件标识常称为文件名。

3文件类型

根据数据的组织形式,分为:

  • 文本文件或者二进制文件

二进制文件:以二进制的形式存储,不加以转换

文本文件:转换后以ascll码形式存储?

?字符以ascll码形式存储。数值型则可以ascll码或二进制。

如:?

10000的存储-->ascll码:10000(5个字节);二进制形式:00 00 27 10(4个字节)

4文件缓冲区

缓冲文件系统:系统自动在内存中为程序中每一个正在使用的文件开辟一块文件缓存区。

内存向磁盘输出数据磁盘向内存的输入数据都会先送到缓冲区,直到装满或结束。缓存区大小由c编译系统决定。

5文件指针

缓存文件系统中,关键概念是文件类型指针。即文件指针。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,存放文件的相关信息(文件名,文件状态,即文件当前位置),保存在一个结构体变量中。结构体类型是有系统声明的取名FILE。

//创建一个FILE*的指针变量

FILE* pf;//文件指针变量

?可以使pf指向某个文件的文件信息区(结构体变量)==》通过文件指针变量能够找到与它相关联的文件。

6文件的打开与关闭

(1)?

  • 读之前打开,使用之后关闭文件。
  • ?在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,相当于创建了指针与文件的关系。

(2)?fopen()函数打开文件;fclose()来关闭文件。

//格式
FILE* fopen(const char* filemane, const char* mode);
int fclose(FILE* stream);

?

?(3)打开方式(部分):

文件使用方式含义如果文件不存在
r? 只读为输入数据,打开已存的文本文件出错
w? 只写为输出数据,打开一个文本文件建立新的
a? 追加向文件尾部添加文件出错
rb? 只读为输入数据,打开一个二进制文件出错
wb? 只写为输出数据,打开一个二进制文件建立新的
ab? 追加向二进制文件追加数据

出错

r+? 读写为读和写,打开一个文本文件

出错

w+? 读写为读和写,建立一个新的文件建立新的
a+? 读写打开一个文件,在尾部进行读写建立新的
rb+? 读写为了读和写,新建一个新的二进制文件建立新的
.........

(4) fopen()::取文件名方式:

相对路径:

  • text.txt? 在当前目录
  • ..\\text.txt? 在上一个目录

绝对路径

  • 把从什么盘开始到文件全部写出来

7文件的顺序读写

?(1)

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

?输入到程序,输出到程序外。

  • int fputs(const char *string,FILE* stream);
  • char *fgets(char* string , int n,FILE* stream);

?②

  • int printf(const char*format[,argument]...);
  • int fprintf(FILE* stream,const char*format[,argument]...)

  • int scanf(const char*format[,argument]...);
  • int fscanf(FILE* stream,const char*format[,argument]...);

  • size_t fwrite(const void*buffer,size_t size,size_t count,FILE*stream) ;
  • size_t fread(void*buffer,size_t size,size_t count,FILE*stream) ;

(2)

标准输入:键盘输入,stdin FILE*

标准输出:屏幕输出,stdout FILE*

int main() {

	int ch = fgetc(stdin);
	fputc(ch, stdout);

	return 0;
}

(3)

//写文件 w模式下
//1
fputc('h', pf);

//2
fputs("hello",pf);

?(4)

//读文件  r模式下
//1
int ch=fgetc(pf);
printf("%c", ch);

//2
char buf[1024]={0};
//中间创建FILE* pf
fgets(buf,1024,pf);//会读取\n
printf("%s\n",buf);
//与gets()和puts()相理解

8文件的随机读写

(1)

fseek

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

int fseek(FILE * stream,long int offset,int origin);

  • offset为求偏移量,origin为文件指针的位置。
  • SEEK_CUR文件指针的当前位置,SEEK_END文件指针的末尾位置,SEEK_SET文件指针的起始位置

(2)

ftell?

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

long int ftell(FILE* stream);

(3)

rewind

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

void rewind(FILE* stream);

9文件结束的判定

(1)

被错误使用的feof

(在文件读取过程中,不能用feof函数的返回值直接用来判断文件是否结束。而是应用于当前文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束)

(2)

①文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgetc)

②二进制文件读取是否结束,判断返回值是否小于实际要读的个数(fread)

10其他(例)

(1)

#include<stdio.h>
#include<errno.h>

int main() {
	FILE* pf = fopen("text.txt", "w");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return 0;
	}
    //打开文件
	//写文件
    fputc('h', pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
}

结果:

会在当前目录新建一个内容为h的text.txt的文件。(若text.txt换成..\\text.txt:结果则是上一个目录)。

(2)

对比:

  • scanf/fscanf/sscanf
  • printf/fprintf/sprintf

第一列:针对标准输入输出流,格式化输入输出语句

第二列:针对所以输入输出流,格式化输入输出语句

第三列:sscanf是从字符串中读取格式化数据;sprintf是把格式化数据输出(存储)字符串

  • int sscanf(const char*buffer,const char*format[,argument]...);
  • int sprintf(char *buffer,const char*format[,argument]...);

11?最后

慢慢补充吧,多实践,(员工簿?)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 09:43:57  更:2021-11-27 09:44:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:24:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码