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语言 -- 文件操作

先来看看:单机进入>>C语言文件基础

文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

  • 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件的状态,文件的当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名为FILE
  • 不同的编译器的FILE类型包含的内容可能会不太相同。
  • 每当打开一个文件时,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
  • 一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来也比较方便。

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

定义pf是一个事项FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。
通过文件指针变量能够找到与之相关联的文件

文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于及案例了指针和文件的关系
fopen函数打开文件,fclose函数关闭文件:

FILE * fopen ( const char * filename, const char * mode );
int fclose ( FILE * stream );

打开方式如下:

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

代码示例:

void main()
{
	FILE* pf;
	pf = fopen("myfile.txt", "w");
	if (pf != NULL)
	{
		fputs("fopen example", pf);
		fclose(pf);
	}
}

文件的顺序读写

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

文件的随机读写

fseek

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

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

代码示例:

void main()
{
	FILE* pf;
	pf = fopen("example.txt", "wb");
	fputs("This is an apple.", pf);
	fseek(pf, 11, SEEK_SET);
	fputs("***", pf);
	fclose(pf);
}

SEEK_SET 起始
SEEK_CUR 当前
SEEK_END 末尾

ftell

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

long int ftell ( FILE * stream );

代码示例:

void main()
{
	FILE* pf;
	long size;

	pf = fopen("example.txt", "rb");
	if (pf != NULL)
	{
		fseek(pf, 0, SEEK_END);
		size = ftell(pf);
		fclose(pf);
		printf("size of example.txt: %ld bytes.\n", size);
	}
}

rewind

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

void rewind ( FILE * stream );

代码示例:

void main()
{
	int n;
	FILE* pf;
	char buffer[27];
	
	pf = fopen("example.txt", "w+");
	for (n = 'A'; n <= 'Z'; n++)
		fputc(n, pf);
	rewind(pf);
	fread(buffer, 1, 26, pf);
	fclose(pf);
	buffer[26] = '\0';
	puts(buffer);
}

文件结束判定

被错误使用的feof

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

  1. 文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets):
  • fgetc判断是否为EOF;
  • fgets判断返回值是否为NULL
  1. 二进制文件读取结束判断,判断返回值是否小于实际要读的个数
  • fread判断返回值是否小于实际要读的个数

代码示例:
文本文件的例子:

void main()
{
	int c; //注意:int,不是char,要求处理EOF
	FILE* pf = fopen("example.txt", "r");
	if (!pf)
	{
		perror("File open failed");
		return;
	}
	//fgetc 当读取失败或者遇到文件结束时,都会返回EOF
	while ((c = fgetc(pf)) != EOF)
	{
		putchar(c);
	}
	//判断是什么原因结束的
	if (ferror(pf))
		puts("\nI/O error when reading");
	else if (feof(pf))
		puts("\nEnd of file reached successfully");

	fclose(pf);
}

二进制文件的例子:

enum {SIZE = 5};
void main()
{
	double a[SIZE] = { 1.0, 2.0, 3.0, 4.0, 5.0 };
	double b = 0.0;
	size_t ret_code = 0;
	FILE* pf = fopen("test.bin", "wb"); //用二进制模式
	fwrite(a, sizeof(*a), SIZE, pf);
	fclose(pf);

	pf = fopen("test.bin", "rb");
	//读double的数组
	while ((ret_code = fread(&b, sizeof(double), 1, pf)) >= 1)
	{
		printf("%lf\n", b);
	}
	if (feof(pf))
		printf("Error reading test.bin: unexpected end of file.\n");
	else if(ferror(pf))
	{
		perror("Error reading test.bin");
	}
	fclose(pf);
	pf = NULL;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-28 22:43:27  更:2021-12-28 22:45:35 
 
开发: 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 11:04:23-

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