目录
一. 为什么使用文件:
二. 什么是文件:
2.1 程序文件:
2.2 数据文件:
2.3 文件名 :
三. 文件的打开和关闭:
3.1 文件指针 :
3.2 文件的打开和关闭:
四. 文件的顺序读写:
4.1 对比一组函数:
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。本章讨论的是数
据文件,在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。 其实有时候我们
会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。
struct _iobuf
{
//文件信息区中记录的相关信息、
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE; //重命名
FILE* pf;//文件指针变量
FILE * fopen ( const char * filename, const char * mode );
当使用fopen函数来成功打开某一个文件的时候,它会自动创建一个文件信息区,并把该文件信息区的起始位置的地址返回去,如果打开失
败,就会返回一个空指针NULL,该函数第一个参数是传文件名,第二个参数是选择打开方式、
其中:
" r ",只读,如果该文件不存在或者没被找到的话就会打开错误,返回一个空指针NULL,
" w ",写文件,如果该文件已经存在,该文件中的内容就会被销毁,相当于打开一个空文件,重新进行书写,如果不存在该文件,就会自
动创建一个新的文件,再进行书写、
" a ",在原有的文件末尾追加内容、如果文件不存在,则会新建一个文件,再进行书写、
其中,关闭文件的函数是fclose函数,使用规则为:
int fclose ( FILE * stream );
//和动态内存开辟中释放内存空间的函数free的使用规则类似。
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
//文件拓展名要记得放出来、
//FILE* pf = fopen("test.dat", "r");
//如果只写出文件名主干和后缀,这就是相对路径,他默认该路径就是和本次项目的工程和代码文件在同一个目录下文件、
//FILE* pf = fopen("D:\2021代码code\Project150\test.dat", "r");
//如果指定出来了具体的路径,则就是绝对路径, 表示的就是该绝对路径下的文件、
//但是如果按照绝对路径直接执行代码,也是不行的,因为其中会存在转义字符,所以要避免转义字符的出现,对其进行改造、则有:
FILE* pf = fopen("D:\\2021代码code\\Project150\\test.dat", "r");
//加上\,来防止转义
//以 写 的形式打开文件的时候,如果该文件不存在,则会重新创建一个新的文件并进行书写、
if (pf == NULL)
{
//打开文件失败
perror("fopen");
return 1;
}
else
{
//打开文件成功
}
//关闭文件
fclose(pf);
pf = NULL;
//一个程序中,能够打开文件的数量是有限的,如果文件只打开不释放,那么后面就不能再打开文件了、
return 0;
}
//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );
打开方式如下:
四. 文件的顺序读写:
fputc函数:
int fputc ( int character, FILE * stream );
写入/输出一个字符,功能:写一个字符到一个流(文件流,磁盘(硬盘))里,或者写一个字符到一个流(标准输出流,stdout,即
打印到屏幕上去)第一个参数是某一个字符的ASCII码值、第二个参数就是指针指向的某一个流。
一、写一个字符到一个流(文件流,磁盘(硬盘))里面:相当于以 %c 进行打印、去掉强制类型转换,笔误、
现在该文件内就有了内容,如果再以" w "的形式去写,但是不写任何内容,对于该打开方式来说,如果已经存在文件,就会把其中的
内容销毁掉、但由于不写入任何数据,所以该文件中就不存在内容了。
二、写一个字符到一个流(标准输出流,stdout,即打印到屏幕上去),还是相当于以 %c 的形式进行打印、
fgetc函数:
int fgetc ( FILE * stream );
从流里面读取一个字符,可以从文件流(磁盘(硬盘)),也可以从标准输入流stdin中读取,该函数的返回值即读取到的字符的
ASCII码值,如果读取失败或者遇到文件结束,则返回的是EOF(-1):
一、从文件流(磁盘(硬盘)),中读取一个字符、相当于以 %c 进行读取,能够读取到空白字符。去掉强制类型转换,笔误、
注意:
在记事本(文件)中点回车,这个回车在此情况下是能当做回车读取进去的、
从流里面读取一个字符,可以从文件流,也可以从标准输入流stdin中读取,该函数的返回值即读取到的字符的ASCII码值,如果读取
失败或者遇到文件结束,则返回的是EOF:遇到文件结束的话,就会返回EOF,即:-1:
二、从标准输入流stdin中读取一个字符:相当于以 %c 进行读取,能够读取空白字符、
读取3个字符,如果输入ab敲回车,和scanf函数类似,在缓冲区内有:ab\n,最后的字符\n会被认为是一个转义字符,即换行, 因为
以%c读取字符的时候,能读取到空白字符、
如果输入a敲回车,在缓冲区内有:a\n,, 前两个fgetc函数就能读取到这两个字符,再打印出来第一个字符a,然后再打印出换行,
但是此时还有一个fgetc函数没有读取到数据,所以会等待你再输入数据,如果再输入b敲回车,,在缓冲区内就有b\n,,但是,只剩
下了一个fgetc函数,只能读取到一个字符,即读取到字符b,然后打印在屏幕上,程序结束。
fputs函数:写入/输出一行、
int fputs ( const char * str, FILE * stream );
写入/输出一个字符串到一个流(文件流,磁盘(硬盘)),或者写一个字符串到一个流(标准输出流,stdout,即打印到屏幕上
去)、相当于以 %s 打印,只把字符\0前面的内容打印出来:都是以文本的方式写进去,,以ASCII码值的形式写入:
一、写入/输出一个字符串到一个流(文件流,磁盘(硬盘))、相当于以 %s 打印,只把字符\0前面的内容打印出来、
1、去掉强制类型转换,笔误、
2、去掉强制类型转换,笔误、
二、写入/输出一个字符串到一个流(标准输出流,stdout,即打印到屏幕上去),相当于以 %s 打印,只把字符\0前面的内容打印出
来、
fgets函数:
char * fgets ( char * str, int num, FILE * stream );
从流里面读取一个字符串,可以从文件流(磁盘(硬盘)),也可以从标准输入流stdin中读取,其中,num代表能够读取到的最多的
字符个数,假设num等于n,,但实际上就读取出来了n-1个字符,,还要留个位置给字符\0、第一个参数是把读出来的字符串放到字
符指针变量str所指的空间中去、该函数的返回值为放置读取出来的字符串的字符数组的首元素的地址、
一、从文件流(磁盘(硬盘))中读取一个字符串,按照 %c 进行读取,能够读取空白字符、
在记事本(文件)中点回车,这个回车是部分情况下不能当做回车读取进去的,不需要研究这个,除此之外,在终端输入时点回车,
在缓冲区内才会有字符\n,会被当做回车处理。去掉强制类型转换,笔误、
二、从标准输入流stdin中读取一个字符串,按照 %c 进行读取,能够读取空白字符、
1、
2、
3、
格式化输出函数:
格式化的数据,即具有一定格式的数据,并不是特指结构体数据,只是结构体成员变量中能够存放不同类型,即不同格式的数据,更
加丰满一些,但不代表只有结构体数据才称得上是格式化数据,像单单一个int整型,比如整型数字5,它也具有一定的格式,也称作
格式化数据、
int printf ( const char * format, ... ); //...代表的是可变参数,参数的个数是可以发生变化的,,format代表的是格式、 int fprintf ( FILE * stream, const char * format, ... ); //用法类似与printf,,把流传过去就行了、
格式化输入函数:
格式化的数据,即具有一定格式的数据,并不是特指结构体数据,只是结构体成员变量中能够存放不同类型,即不同格式的数据,更
加丰满一些,但不代表只有结构体数据才称得上是格式化数据,像单单一个int整型,比如整型数字5,它也具有一定的格式,也称作
格式化数据、
int scanf ( const char * format, ... ); int fscanf ( FILE * stream, const char * format, ... );
以上所有都是以文本形式进行写入/读取 文件的,以ASCII码值进行写入/读取、
二进制输出:适用于结构体、
以二进制方式进行 写入/读取 文件、
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
写数据到一个流里面去, 无具体类型的指针变量ptr是要写的数据的地址,size是要写的数据的元素的大小,单位是字节,count是指
的元素个数最大值、
由于在记事本中,都是文本的形式展示的,但是以二进制的形式写入的数据,如果使用记事本进行展示的话,会把以二进制形式写进
去的数据再以文本形式展示出来,这样是看不懂的,是乱码, 但是,字符串和字符以二进制的形式写入和以文本的形式写入内容是一
样的,本质上都是存储的每个字符的ASCII码值,其他类型的数据,是不一样的、
二进制输入:适用于结构体、
对于fread函数来说的话,他就是以二进制的形式进行 读取/输入 的,该函数能够看懂二进制形式写进去的数据、
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
fwrite函数和fread函数是一对,二进制形式写入,二进制形式读取。
1、scanf:输入型函数,指定一定的格式输入,比如:%d,%s,%c等,针对标准输入(键盘)的格式化的输入语句,所谓格式化的
输入语句,即按照一定的格式进行输入,针对的是:stdin、
2、fscanf:可以针对标准输入流,也可以针对文件流,适用于所有输入流的格式化输入语句、—— stdin、文件等、
3、sscanf:从一个字符串中读取格式化的数据,即读取具有一定格式的数据、
int sscanf ( const char * s, const char * format, ...); //从一个字符串中读取格式化的数据,字符指针变量s指向了该字符串首字符的地址,即从字符指针变量s所指的字符串中读取格式化的数据,剩下的参数的使用方法和scanf函数是一样的、 //相当于把一个字符串中的数据转换成格式化的数据,即有格式的数据、 int scanf ( const char * format, ...);
比如:
1、printf:输出型函数,指定一定的格式输出,比如:%d,%s,%c等,针对标准输出(屏幕)的格式化输出语句,针对的是:
stdout、
2、fprintf:可以针对标准输出流,也可以针对文件流,适用于所有输出流的格式化输出语句、—— stdout、文件等、
3、sprintf:把格式化的数据,即具有一定格式的数据, 转换为一个字符串、
int sprintf ( char * str, const char * format, ... ); //写格式化的数据到一个字符串中,字符指针变量str指向了该字符串首字符的地址,即把格式化的数据写到字符指针变量str所指的字符串中,剩下的参数的使用方法和printf函数是一样的、 //相当于把格式化的数据,即有格式的数据转换成一个字符串、 int printf ( const char * format, ... );
比如:
格式化的数据,即具有一定格式的数据,并不是特指结构体数据,只是结构体成员变量中能够存放不同类型,即不同格式的数据,更
加丰满一些,但不代表只有结构体数据才称得上是格式化数据,像单单一个int整型,比如整型数字5,它也具有一定的格式,也称作
格式化数据、
今天的分享到此为止,下面的内容会陆续更新,谢谢大家~