目录
什么是文件?
磁盘上的文件是文件。
但在程序设计中,我们一般谈论的文件从功能的角度来分类的话,一般分为两种:程序文件、数据文件。
程序文件
程序文件包括源文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
数据文件
文件的内容不一定是程序,而是程序运行时读写的程序。而在这篇博客里,我们将要了解的是数据文件。
数据文件的分类
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII形式存储,则需要在存储前转换。以ASCII的形式存储的文件就是文本文件。
如果由整数10000,如果ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制输出,则在磁盘上只占4个字节。
文件的打开和关闭
流
C程序针对文件、画画、键盘等数据输入输出操作都是通过流操作的。
一般情况下,我们想要向流里写数据,或者从流中读取数据,都是打开流,然后操作。
标准流
- stdin-标准输入流,在大多数环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
- stdout-标准输出流,在大多数环境中输出至显示器界面,printf函数就是将信息标准输出到流中。
- stderr-标准错误流,大多数环境中输出到显示器界面。
stdin、stdout、stderr三个流的类型是:FILE*,通常称为文件指针。
C语言中,就是通过FILE*的文件指针来维护着各种流的操作的。
文件指针
缓冲文件系统中,关键的概念是”文件类型指针“,简称为”文件指针“。
创建文件指针
FILE* pf;
定义pf是一个指向FILE类型数据的指针变量。可以使得pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区的信息就能够该访问文件。
也就是说通过文件指针变量能够间接找到与它相关的文件。
打开和关闭
文件在读写前应该先打开文件,在使用结束之后关闭文件。
ANSIC规定使用fopen函数打开文件,fclose关闭文件。
例子如下
#include <stdio.h>
int main()
{
FILE* p;
p = fopen("myfile.txt","w");
if(p != NULL)
{
fputs("fopen example", p);
fclose(p);
}
return 0;
}
文件的顺序读写
介绍
函数名 | 功能 | 适用于 |
fgets | 字符输入函数 | 所有输入流 |
fputs | 字符输出函数 | 所有输出流 |
fgets | 文本行输入函数 | 所有输入流 |
fputs | 文本行输出函数 | 所有输出流 |
fscanf | 格式化输入函数 | 所有输入流 |
fprintf | 格式化输出函数 | 所有输出流 |
fread | 二进制输入 | 文件 |
fwrite | 二进制输出 | 文件 |
文件的随机读写
fseek
概念
根据文件指针的位置和偏移量来定义文件指针。
例子
#include <stdio.h>
int main()
{
FILE* p;
p = fopen("myfile.txt", "wb");
fputs("This is an apple.", p);
fseek(p, 9, SEEK_SET);
fputs("sam", p);
return 0;
}
ftell
概念
返回文件指针相对于起始位置的偏移量
例子
#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;
}
rewind
概念
让文件指针的位置回到文件的起始位置
例子
#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';
printf(buffer);
return 0;
}
文件读取结束的判定
feof
在文件读取过程中,不能用feof函数的返回值直接判断文件的是否结束。
feof的作用是:当文件读取结束的时候,判断读取结束的原因是否是:遇到文件尾结束
文件缓冲区
因为有缓冲区的存在,C语言在操作文件的时候,需要刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题。