目录
- 
- 1.什么是文件?
 - 
- [1.1 程序文件](#1.1 程序文件)
 - [1.2 数据文件](#1.2 数据文件)
 
 - 2.二进制文件和文本文件?
 - 3.文件的打开和关闭
 - 4.文件的顺序读写
 - 5.文件的随机读写
 - 
- [5.1 fseek](#5.1 fseek)
 - [5.2 ftell](#5.2 ftell)
 - [5.3 rewind](#5.3 rewind)
 
 - 6.文件读取结束的判定
 - 7.文件缓冲区
 
 
1.什么是文件?
磁盘上的文件就是文件
一般包含两种:程序文件 ,数据文件
1.1 程序文件
程序文件包含源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)
1.2 数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据文件,或者输出内容的文件
2.二进制文件和文本文件?
根据数据的组织形式,数据文件被称为文本文件 和二进制文件
二进制文件 :数据在内存中以二进制形式存储,不加转换的输出到外存的文件中
文本文件:要求在外存上以ASCll码的形式存储,则需要在存储前转换
3.文件的打开和关闭
文件在读写前应该打开文件 ,在使用结束后应该关闭文件
            
            
              c
              
              
            
          
          //打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );
        | "r"(只读) | 为了输入数据,打开一个已经存在的文本文件 | 
|---|---|
| "w"(只写) | 为了输出数据,打开一个文本文件 | 
| "a"(追加) | 向文本文件尾添加数据 | 
| "rb"(只读) | 为了输入数据,打开一个二进制文件 | 
| "wb"(只写) | 为了输出数据,打开一个二进制文件 | 
            
            
              c
              
              
            
          
          #include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	//写文件
	char a = 'a';
	for (; a <= 'z'; a++)
	{
		putc(a, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
        4.文件的顺序读写

上面说的适用于所有输入流⼀般指适用于标准输入流和其他输入流(如文件输入流);所有输出流⼀
般指适用于标准输出流和其他输出流(如文件输出流)。
5.文件的随机读写
5.1 fseek
根据文件指针的位置和偏移量来定位文件指针
            
            
              c
              
              
            
          
          int fseek ( FILE * stream, long int offset, int origin );
        举例:
            
            
              c
              
              
            
          
          #include <stdio.h>
int main()
{
	//打开文件
	FILE* pr=fopen("test.txt", "r");
	if (pr == NULL)
	{
		perror("fopen");
		return;
	}
	//读文件
	int ch = 0;
	ch=fgetc(pr);
	printf("%c\n", ch);
	fseek(pr, 4, SEEK_CUR);
	ch = fgetc(pr);
	printf("%c\n", ch);
	//关闭文件
	fclose(pr);
	pr = NULL;
	return 0;
}
        5.2 ftell
返回文件指针相对于起始位置的偏移量
            
            
              c
              
              
            
          
          long int ftell ( FILE * stream );
        举例:
            
            
              c
              
              
            
          
          /* ftell example : getting size of a file */
#include <stdio.h>
int main ()
{
  FILE * pFile;
  long size;
  pFile = fopen ("myfile.txt","rb");
  if (pFile==NULL) perror ("Error opening file");
  else
  {
    fseek (pFile, 0, SEEK_END);   // non-portable
    size=ftell (pFile);
    fclose (pFile);
    printf ("Size of myfile.txt: %ld bytes.\n",size);
  }
  return 0;
}
        5.3 rewind
让文件指针的位置回到文件的起始位置
            
            
              c
              
              
            
          
          void rewind ( FILE * stream );
        举例:
            
            
              c
              
              
            
          
          /* rewind example */
#include <stdio.h>
int main ()
{
  int n;
  FILE * pFile;
  char buffer [27];
  pFile = fopen ("myfile.txt","w+");
  for ( n='A' ; n<='Z' ; n++)
    fputc ( n, pFile);
  rewind (pFile);
  fread (buffer,1,26,pFile);
  fclose (pFile);
  buffer[26]='\0';
  puts (buffer);
  return 0;
}
        6.文件读取结束的判定
注意:在文件读取过程中,不能用feof函数的返回值直接来判断文件是否结束
feof的作用:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束
- 文本文件读取是否结束,判断返回值是否为
EOF(fgetc),或者NULL(fgets) - 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数
fread判断返回值是否小于实际要读的个数
 
7.文件缓冲区

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件