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