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++知识库 -> 32.0、C语言——文件操作 (3) -> 正文阅读

[C++知识库]32.0、C语言——文件操作 (3)

32.0、C语言——文件操作 (3)

文件的随机读写:

fseek (?) 函数

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

Moves the file pointer to a specified location;

这是一个根据文件指针的位置和偏移量来定位文件指针的函数 fseek() ;

? ? ? ? 第一个参数指的是 ->?文件的流
? ? ? ? 第二个参数指的是 -> 偏移量,相对于当前指针设置的位置进行偏移【给正数就是向后偏移,负数就是向前偏移】
? ? ? ? 第三个参数指的是 ->?文件指针的当前位置

那么第三个参数是设置指针位置,C语言有三个位置参数:

? ? ? ? 1. SEEK_CUR ——?文件指针的当前位置
? ? ? ? ? ??
Current position of file pointer;

? ? ? ? 2. SEEK_END —— 文件的末尾位置
? ? ? ? ? ??
End of file;

? ? ? ? 3. SEEK_SET —— 文件起始位置
? ? ? ? ? ? Beginning of file;

fseek 实例代码如下:

int main() {
	FILE* pf = fopen("TEST.txt","r");
	if (pf == NULL) {
		return 0;
	}
	//1.定位文件指针
	fseek(pf, 2, SEEK_CUR);
	//2.读取文件
	int ch = fgetc(pf);
	printf("%c\n",ch);
	fclose(pf);
	return 0;
}

TEST.txt文件中内容为:a b c d e f?

上述代码表示 ->
? ? ? ?
1.?以读的形式打开文本文件 TEST.txt,并返回指向该文件结构体的内存的指针给 pf ;
? ? ? ? 2. fseek()函数,传入 -> 第一个参数?pf ,第二个参数向后偏移 2 个字符,第三个参数文件指针的位置从 SEEK_CUR(也就是文件的起始位置)开始;?

? ? ? ? 3. 读取文件 TEST.txt 中的从首字符开始向后偏移 2 个位置的字符 c ,并且用 ch 接收读取到的字符 c ;
? ? ? ? 4. 输出查看读到的字符是否为 c ,输出后查看确实为字符 c;

????????

????????如果想得到字符 e 就偏移 4 ;
????????假设指针位置设置的是——?SEEK_END 那么这时候文件指针指向的是字符 f 的后面【注意 -> 不是 f 的前面】那么这时候想要读到字符 e 的话就向前偏移 2 才可以读到 字符 e

ftell ( ) 函数

long int ftell ( FILE* stream );

返回文件指针相对于起始位置的偏移量【这里的起始位置指的就是最文件前面的位置】;

实例代码,如下所示 ->

int main() {
	FILE* fp = fopen("TEST.txt","r");

	fseek(fp, 3, SEEK_CUR);
	int flag = ftell(fp);

    printf("falg = %d",flag);

	fclose(fp);
	fp = NULL;
	return 0;
}

????????输出的结果为 flag = 3??,因为前面 fseek() 偏移了 3,所以用 ftell ( fp );可以算出 fp 指针便宜了多少;如果指针没有移动过那么 ftell() 算出来就是 0;

? ? ? ? 那这里需要注意的是,如果在 ftell ( fp ) 之前用了 fgetc ( fp?) ,那么 fgetc() 去读了一次之后文件指针会往后移动一位,那么这时候如果用 ftell(fp) 算出的结果就是 1 了;?

rewing ( ) 函数

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

void rewing ( FILE* stream?);

rewing( pf );->

会让 pf 文件指针回到他指向的那个文件的起始地址;

文件结束判定

feof ( ) 函数

被错误使用的feof

牢记:在文件读取过程中,不能用 feof 函数的返回值直接用来判断文件是否结束;而是应用于当文件结束的时候【此时我们已经知道文件结束了,然后用 feof() 去判断导致文件结束的原因】,判断是读取失败结束,还是遇到文件尾结束;

? ? ? ? 1. 文本文件读取是否结束,用 fgetc() 读取内容,判断读取到的字符是否为 EOF(fgetc),或者用 fgets() 判断读到字符串的内容是否为?NULL ( fgets );

? ? ? ? 例如:
? ? ? ? ? ? - fgetc 判断是否为 EOF;

? ? ? ? ? ? - fgets 判断返回值是否为 NULL;

????????2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数【例如?fread() 函数读取之后会返回实际读取到的数据的个数,当实际要读取的个数小于应该读取的个数时就说明文件读取结束了】;

? ? ? ? 例如:

? ? ? ? ? ? - fread 判断返回值是否小于实际要读的个数;

????????我们将 TEST.txt 文本文件置为空后,打开该文件,然后读取,得到的返回值是 -1,所以 EOF 的值为 -1

perror ( ) 函数

这个函数和strerror(); 使用的方法差不多,但是比strerror() 更简单;
实例代码,如下所示:

int main() {
	FILE* pf = fopen("test2.txt","r");
	if (pf == NULL) {
		perror("澜色海湾");
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

这里由于我们没有创建 test2.txt 文件,所以无法找到该文件,而perror() 会输出相应的错误,如下图所示->

那我们的文件读取结束之后,用以下代码去判断导致结束的原因 ->

if(ferror(fp)) {
    puts("I/O error when reading");
}else if(feof(fp)) {
    puts("End of file reached successfully")
}

? ? ? ? 1. 首先用 ferror ( fp ) 判断一下 流 上是否出现了异常,如果返回为真的话说明是因为流读取失败而导致的读取结束;

? ? ? ? 2. 然后用 feof( fp ) 判断一下是否为读取文件正常结束,如果判断返回值为 非0 则说明是遇到了文件的结束标志而读取结束的;?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-25 23:05:06  更:2022-09-25 23:05:44 
 
开发: 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/23 9:42:49-

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