目录
- 1.什么是文件?
- 1.1 程序文件
- 1.2 数据文件
 
- 2.二进制文件和文本文件?
- 3.文件的打开和关闭
- 4.文件的顺序读写
- 5.文件的随机读写
- 5.1 fseek
- 5.2 ftell
- 5.3 rewind
 
- 6.文件读取结束的判定
- 7.文件缓冲区
 
1.什么是文件?
磁盘上的文件就是文件
 一般包含两种:程序文件,数据文件
1.1 程序文件
程序文件包含源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)
1.2 数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据文件,或者输出内容的文件
2.二进制文件和文本文件?
根据数据的组织形式,数据文件被称为文本文件和二进制文件
 二进制文件:数据在内存中以二进制形式存储,不加转换的输出到外存的文件中
 文本文件:要求在外存上以ASCll码的形式存储,则需要在存储前转换
3.文件的打开和关闭
文件在读写前应该打开文件,在使用结束后应该关闭文件
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );
| “r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 
|---|---|
| “w”(只写) | 为了输出数据,打开一个文本文件 | 
| “a”(追加) | 向文本文件尾添加数据 | 
| “rb”(只读) | 为了输入数据,打开一个二进制文件 | 
| “wb”(只写) | 为了输出数据,打开一个二进制文件 | 
#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
根据文件指针的位置和偏移量来定位文件指针
int fseek ( FILE * stream, long int offset, int origin );
举例:
#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
返回文件指针相对于起始位置的偏移量
long int ftell ( FILE * stream );
举例:
/* 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
让文件指针的位置回到文件的起始位置
void rewind ( FILE * stream );
举例:
/* 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语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件



















