C指针详解五

文章目录

    • 1、文件的基本操作
      • (1)文件指针的定义:
      • (2)文件的打开
      • (3)文件的关闭
    • 2、文件的读写函数
      • (1) 字符输入输出函数
        • 输入函数:
        • 输出函数:
      • (2)字符串输入输出
        • 输入函数:
        • 输出函数:
        • 格式化输入输出函数
        • 数据块输入输出
    • 3、文件读写操作的内部机制
    • 4、顺序读写操作
    • 5、随机读写操作
      • 位置指针移动(fseek)
      • 位置指针返回到文件头(rewind)
      • 取位置指针(ftell)

1、文件的基本操作

(1)文件指针的定义:

FILE *fp;

(2)文件的打开

fopen函数用来打开文件,其在stdio.h中,一般调用形式为

FILE *fp;
fp=fopen(“文件名”,“使用文件的方式”);

其中打开文件的方式有如下几种
C指针详解五_第1张图片
例如用只写的方式打开文件1.txt

FILE *fp;
fp=fopen("1.txt","w");

如果fopen成功打开文件,则返回一个有确定指向的指针;如果打开失败,则返回NULL。

(3)文件的关闭

文件的关闭需要使用fclose函数,其也在stdio.h中,使用方式如下

fclose(文件指针);
例如:fclose(fp);

如果正常完成文件关闭,则返回一个值是0,否则返回EOF(END OF FILE)
说明:在程序结束之前需要关闭文件,目的是为了防止因为没有关闭文件造成数据损坏。

2、文件的读写函数

文件顺序操作
对文件的操作(文件读写)必须按文件中字符的先后顺序进行,只能在操作了第i个字符之后,才能操作第i+1个字符。 在对文件操作时,文件的位置指针由系统自动向后(文件尾的方向)移动
进行顺序操作的函数
字符输入输出函数fgetc fputc
字符串输入输出函数fgets fputs
格式化输入输出函数fscanf fprintf
数据块输入输出函数fread fwrite

(1) 字符输入输出函数

输入函数:

ch=fgetc(fp);     /*fp 为已经打开的文件的指针 */ 

函数功能:
从指定的文件中读取一个字符。即:从fp所指向的文件 ( 该文件必须是以读或读写方式打开的 )中读取一个字符返回 ,读取的字符赋给变量ch。
对于ASCII文件,若读取字符时文件已经结束或出错,则返回文件结束标记EOF(-1)。

输出函数:

fputc(ch,fp);     /*ch为需要输出的字符*/

函数功能:
将一个字符输出到指定文件中。即将字符变量ch中的字符 输出到所指向的文件。
若输出操作成功,该函数返回输出的字符;否则,返回EOF。

(2)字符串输入输出

输入函数:

fgets(s,n,fp) ;

其中参数:char s[];int n;FILE *fp;
函数功能:
数组s已经定义,从fp所指向的文件中读取长度不超过n-1个字符的字符串,并将该字符串放到字符数组s中。函数的返回值为字符数组 s的首地址;如果文件结束或出错,则返回NULL 。
fgets(s,n,fp)
情况1:已读入n-1个字符,
则:s中存入n-1个字符,串尾为\0
情况2:读入字符遇到\n,
则:s中存入实际读入的字符,串尾为\n\0
情况3:读入字符遇到文件尾
则:s中存入实际读入的字符,EOF不会存入数组,串尾为\0
情况4:当文件已经结束时,继续读文件
则:函数的返回值为NULL,表示文件结束

输出函数:

函数格式:

fputs(s,fp);

参数:chars[];FILE*fp;
函数功能:将字符数组s中的字符串写入文件指针fp所指的文件中 。
说明:第一个参数可以是字符串常量、字符数组名或字符型指针。字符串末尾的‘\0’不输 出。
返回值:输入成功,返回值为0; 输入失败,返回EOF。

格式化输入输出函数

输入函数 :

 fscanf(fp,格式控制符,变量地址表); 

参数:FILE *fp;
函数功能:从fp所指向的ASCII文件中读取字符,按格式控制符的含义存入对应的变量中,返回值为输入的数据个数。
fscanf与scanf类似格式控制符相同。

输出函数:

fprintf(fp,格式控制符,表达式列表);

参数:FILE*fp;
函数功能:将表达式列表中的数据,按照格式控制符的说明,存入fp所指向的ASCII文件中,返回值为实际存入的数据个数。
fprintf与printf类似,格式控制符相同。

数据块输入输出

输入函数:

 fread(buffer, size, count, fp);

参数:char * buffer; unsigned size; intcount; FILE *fp; 函数功能:从二进制文件fp中读取count个数据块存入buffer中, 每个数据块的大小为size个字节。操作成功,函数的返回值为实 每个数据块的大小为size个字节。操作成功,函数的返回值为实 际读入的数据块的数量;若文件结束或出错,返回值为0。
输出函数:

fwrite(buffer, size, count, fp);

参数:char * buffer; unsigned size; int count; FILE *fp; 函数功能: 将buffer中的count个数据块写入二进制文件fp中,每个数据块的大小为size个字节。操作成功,函数的返回值为实际写入文件的数据块的数量;若文件结束或出错返回值为0。

3、文件读写操作的内部机制

文件的读写是通过文件系统内部的“位置指针”进行的。 当打开一个文件时,系统自动为打开的文件建立一个位置指 针,对该文件的读写操作均通过位置指针进行操作。
fopen后位置指针指向文件中第1个(将要读写)字节。
文件结束时,位置指针指向文件最后1个字节的下1个位置 。

4、顺序读写操作

 顺序读写操作 在顺序读写文件时,文件的位置指针由系统自动控制,每 次读写操作后系统都会将位置指针移到下个数据的位置 次读写操作后,系统都会将位置指针移到下一个数据的位置。 在不改变位置指针的情况下,只能对文件进行顺序操作。

5、随机读写操作

随机读写操作 通过改变文件的位置指针,可在文件的任意位置进行读写 操作 操作。

位置指针移动(fseek)

函数格式:

fseek(fp,offset,position);
/*  FILE*fp;
long offset;
int position; */

函数功能:将指定文件fp的文件位置指针按照position规定的方式移动offset个字节。移动成功返回值为0;否则,返回值为非0。
position为起始点,指出以文件的什么位置为基准进行移动:
0──文件的开头;
1──文件的当前位置;
2──文件的末尾。
fseek(fp,50,0)从文件头开始向前(文件尾方向)移动50个字节
fseek(fp,-10,1)从当前位置向后(文件头方向)移动10个字节
fseek(fp,-20,2)从文件尾开始向后(文件头方向)移动20个字节

位置指针返回到文件头(rewind)

rewind(fp) 
/*   FILE*fp;   */ 

函数功能:使fp指定的文件的位置指针重新定位到文件的头位置。

取位置指针(ftell)

 ftell(fp)  
  /*	FILE*fp;	*/ 

函数功能:得到fp所指向文件的当前读写位置,即位置指针的当前值。
该值是一个长整型数,是位置指针从文件开始处到当前位置的位移量的字节数。如果函数的返回值为1L,表示出错。

你可能感兴趣的:(c)