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 则说明是遇到了文件的结束标志而读取结束的; 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值