文件
=================目录=====================
=====================================
文件的读写及储存
一.文件的定义
文件名 = 文件路径 + 文件名主干 + 文件后缀
二.文件类型
- 文本文件:以ACSII字符形式存储的文件
- 二进制文件:以二进制形式储存的文件
三.储存方式:
-
字符一律以ASCII形式储存
-
数值型数据以ASCII/二进制形式存储
-
从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。
-
如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区。
四.打开/关闭方式
打开一个文件(fopen),系统会创建一个FILE的结构体变量,其中包含着各种关于文件的属性(通过FILE指针维护FILE变量).
1.fopen:
FILE * fopen ( const char * filename, const char * mode )
①参数
- filename---------要打开的文件的名称的字符串
②返回值
- 指向流的指针
③注意事项
- 如果打开失败,返回NULL
2.fclose:
int fclose(FILE* stream)
//关闭之后将fclose中的指针置为空
stream = NULL
//文件的打开和关闭
FILE*ret = fopen("文件的打开和关闭.txt", "r");
if (ret == NULL) {
perror("open file for reading");
return 1;
}
fclose(ret);
ret = NULL;
五.读写数据
1.写数据:
//写数据
FILE* ret2 = fopen("文件的打开和关闭.txt", "w");
if (ret2 == NULL) {
perror("open file for writting");
return 1;
}
fputs("hello\n", ret2);
fputs("haha", ret2);
fclose(ret2);
ret2 = NULL;
2.读数据:
//读数据
FILE* ret3 = fopen("文件的打开和关闭.txt", "r");
if (ret3 == NULL) {
perror("open file for reading");
return 1;
}
fgets(arr, 20, ret3);
printf("%s", arr);
fgets(arr, 20, ret3);
printf("%s", arr);
3.拷贝:
FILE*ret = fopen("文件的打开和关闭.txt", "r");
if (ret == NULL) {
perror("open file for reading");
return 1;
}
FILE* res = fopen("文件的打开.txt", "w");
if (res == NULL) {
perror("open file for reading");
fclose(ret);
ret = NULL;
return 1;
}
//拷贝
while (fgetc(ret) != EOF) {
fputc(fgetc(ret),res);
}
fclose(ret3);
ret3 = NULL;
六.读写指令(r,w)
“r” | 读(文件不存在,会失败) |
---|---|
“w” | 写(打开一个空文件,如果文件已经存在,内容会被销毁) |
“a” | 向文本文件尾添加数据(文件不存在,会失败) |
"rb"只读 | 为了输入数据,打开一个二进制文件(文件不存在,会失败) |
"wb"只写 | 为了输出数据,打开一个二进制文件(文件不存在,会建立一个新的文件) |
"ab"追写 | 二进制文件尾添加数据(文件不存在,会失败) |
七.输入输出函数
1.fputc—把c字符放到stream流中
int fputc(int c,FILE* stream)
fputc("h", ret2);
2.fgets—在pf中打印n长的string字符串
char* fgets(char* string,int n,FILE* pf)
fgets(arr, 20, ret3);
3.fprintf
int fprintf(FILE* stream,const char* format…)
fprintf(up,"%s %d",%a,&b)
4.fscanf
int fscanf(FILE* stream,const char* format)
fscanf(up,"%s %d",%a,&b)
5.sprintf—将后面结构化的数据转化为字符串形式:
int sprintf(const char* buffer,const char* format…)
sprintf(str,"%s %d",%a,&b)
6.sscanf—将后面的数据提取为结构化的数据:
int sscanf(const char* buffer,const char* format)
sscanf(str,"%s %d",%a,&b)
7.fread—将流里的数据读到buffer里(函数返回值为真实返回完整元素的个数)
size_t fread(void* buffer,size_t size,size_t count,FILE* stream)
(,要读的数据每个元素大小,最多读几个数据,流)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct Stu{
char name[20];
int age;
};
int main()
{
struct Stu s = {"zhangsan",20};
FILE* pf = fopen("text.txt","wb");
if(pf == NULL){
perror("open file for writting");
return 1;
}
//写文件
fread(&s,sizeof(struct Stu ),1,pf);
printf("%s %d",s.name,s.age);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
8.fwrite—将buffer的数据写到流里
size_t fwrite(const void* buffer,size_t size,size_t count,FILE* stream)
(要写数据的地址,要写的数据每个元素大小,最多写几个数据,流)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct Stu{
char name[20];
int age;
};
int main()
{
struct Stu s = {"zhangsan",20};
FILE* pf = fopen("text.txt","wb");
if(pf == NULL){
perror("open file for writting");
return 1;
}
//写文件
fwrite(&s,sizeof(struct Stu),1,pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}