目录
printf fprintf sprintf ; scanf fscanf sscanf 对比
为什么使用文件
我们都知道,通常情况下,程序的结束也就意味着里面存储的数据将会被销毁,但是有些情况下我们需要保存数据,那就要用到文件了,例如我们要做一个通讯录系统,我们肯定是想要输入的联系人的信息保存下来,这时候就要用文件来保存数据。使用文件我们可以将数据直接存放在电脑的硬盘上,做到数据的持久化。
什么是文件
硬盘上的文件就是文件。在程序设计中,我们一般讲的的文件有两种(从文件功能的角度来分类):程序文件、数据文件 。
程序文件
包括源程序文件(后缀为 .c),目标文件(windows环境后缀为 .obj),可执行程序(windows环境后缀为 .exe)
数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件或者输出内容的文件 。本篇博客也是主要将数据文件。
文件名
一个文件要有唯一的标识,以便使用和识别。文件名包括3个部分:文件路径 + 文件名主干 + 文件后缀。例如:c:\code\test.txt 。(文件路径指的是从盘符到该文件所经历的路径中个符号名的集合)
文件的打开和关闭
文件指针
缓冲文件系统中,关键的概念是“文件类型指针”,简称文件指针。
缓冲文件系统后面会讲,你若想要先了解可以翻到博客结尾。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件的状态、文件的位置等)。这些信息是保存在一个结构体变量中。该结构体类型是有系统声明的,取名为FILE。(不同的编译器的FILE类型包括的内容不完全相同,但是大同小异。)
每打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息。一般都是通过一个FILE的指针来维护这个FILE结构的变量。
例:
FILE* pf//文件指针变量
定义pf是一个指向FILE类型数据的指针变量,可以是pf指向某个文件的文件信息区(一个结构体变量)。通过该文件信息区的信息就能够刚问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。
文件的打开和关闭
文件在读写之前先要打开文件,应用结束后也要关闭文件 。
打开文件使用的函数为 fopen()
函数原型:FILE* fopen( const char* filename, const char* mode)
filename:文件名。
mode: 文件使用的方式。
FILE* :返回一个文件指针。
关闭文件使用的函数 fclose( )
函数原型: int fclose( FILE* stream )
stream :指向文件结构体的指针。
例:
FILE* pf = NULL;
//打开文件
pf = fopen("test.txt", "w");
//关闭文件
fcolse(pf);
pf = NULL;
mode的取值:
例:
#include<stdio.h>
int main()
{
FILE* pf = NULL;
//打开文件
pf = fopen("test.txt", "w");//只读;当指定文件不存在时,自动创建一个新的文件
if (NULL == pf)//判断是否打开失败
{
perror("fopen:");//出错原因
return 1;
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
可以看出在程序执行后创建了一个.txt的文本文件。
文件的顺序读写
函数介绍
在C语言中,术语流(stream)表示任意输入的源或者任意输出的目的地。许多小型程序都是通过一个流(通常和键盘有关)获得全部的输入,并且通过另外一个流(通常和屏幕有关)写出全部的输出 。简单一点就是讲程序通过流来输出、出入。
我们的程序一般都要包含<stdio.h>, 这个头文件里有三个标准流可以直接使用,不用声明,也不用打开和关闭,也就是说当程序运行起来这三个流是默认打开的。它们是:
字符输入函数:fgetc( )
函数原型:int fgetc( FILE* stream)
stream: 指向文件结构体的指针
返回类型为int 当读入错误或文件结尾返回EOF.
使用:
这里采用只读,所以要先创建一个文件。
#include<stdio.h>
int main()
{
FILE* pf = NULL;
//打开文件
pf = fopen("test05.txt", "r");
if (pf == NULL)//判断文件是否打开成功
{
perror("fopen:");
return 1;
}
//读取文件
int ch = 0;
while ((ch = fgetc(pf)) != EOF)
{
printf("%c ",(char)ch);
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
运行结果:
字符输入函数:fputc( )
函数原型:int fputc( int c, FILE*stream)
c : 写入的字符
stream: 指向文件结构体的指针
返回类型为int,当写入失败时返回EOF