文件输入和输出
1.基础概念
- 输入和输出都是缓冲的
- FILE 是一种结构,是专门用来指向文件的指针
- 文件只有在打开后,才能进行读写
文件 | 文件指针 | 常用设备 | 特殊方法 |
---|---|---|---|
标准输入 | stdin | 键盘 | 具有缓冲,整行输入 |
标准输出 | stdout | 屏幕 | 具有缓冲,整行输出 |
标准错误 | stderr | 屏幕 | 即时输出,无需等待 |
打开的文件 | fp(自定义) | 文件 | 无 |
几种常见的FILE的类型
2.fopen()
FILE *fp;//先定义一个文件指针
fp=fopen("文件名","打开方式");
- fopen打开的是同路径下的文件,如果文件打开失败返回NULL
- 使用fopen()需要验证是否成功打开文件,即返回值是否为NULL
- fopen()的两个参数,都要加”“
打开方式 | 含义 |
---|---|
r | 只读模式,只能查看信息 |
w | 写入模式,清空(新建)原文件,重新输入 |
a | 续写模式,在(新建)原文件后,添加输入 |
r+ | 读写模式,覆盖文件前部内容 |
w+ | 读写模式,清空后输入 |
a+ | 读写模式,在文件后续写 |
3.fclose()
fclose(fp);
- 关闭参数是文件指针,定义的文件指针,不是文件名称
- 使用fclose()需要验证是否成功打开文件,即返回值是否为NULL
4.getc()和putc()
ch = getc(fp);
putc(ch,FILE类型);
5.fprintf()和fscanf()
- fprintf(FILE类型,”%d”,num);
- fscanf(FILEl类型,”%d”,num);
6.fgets()和fputs()
- fgets(字符串地址,偏移量,FILE类型);
- fputs(字符串地址,FILEl类型);
7.fseek()和ftell()
fseek()表示调整文件当前的位置
rewind()表示返回文件的开头位置
ftell()表示当前位置到文件开头的距离
- fseek(文件指针,长度L,起点模式);
- ftell(文件指针);
- ftell()可以作为fseek()的第二个参数
- rewind(fp) == fseek ( fp,0L,SEEK_SET )
模式 | 偏移量的起始点 |
---|---|
SEEK_SET | 文件开始处 |
SEEK_CUR | 当期位置 |
SEEK_END | 文件结尾 |
8.文件的二进制与文本模式
二进制文件就是把内存中的数据按内存中存储的形式输出到磁盘中存放,即存放的是数据的原形式。
文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,即存放的是数据的终端形式
在实际存储中最好是将数据分成字符数据和非字符数据两类:
- 如果存储的是字符数据,无论采用文本文件还是二进制文件都是没有任何区别的,所以讨论使用文本文件还是二进制文件是没有意义的。
- 如果存储的是非字符数据,又要看我们使用的情况来决定:
- a:如果是需要频繁的保存和访问数据,那么应该采取二进制文件进行存放,这样可以节省存储空间和转换时间。
- B:如果需要频繁的向终端显示数据或从终端读入数据,那么应该采用文本文件进行存放,这样可以节省转换时间。
文本模式保存,二进制保存
9.fwrite()和fread()
fwrite(name,sizeof(int),5,fp);
fread(name,sizeof(int),5,fp);
//函数的参数为(存储的内容,字节数,个数,位置)
可以存储一个复杂的数据结构,而不需要向fscanf()一样,写多个转义类型
返回值为成功读取相关类型的个数
读取时相关信息,需要先分配内存
链表的存储时,二次读取时,地址信息会改变,需要新建一个链表,而不能使用存储的地址。
以文件是否为控制eof结束读取