文件应用,写日志
文件
数据文件和程序文件
程序文件可以向数据文件中读写
文件名
文本的存储形式
文本文件 和二进制文件
区别:内存向外部显示时,
转化成ASCII的字符的是文本文件,按字符显示,能读懂文件内容,一般有几个数字就占几个字节。
不转化的是,二进制文件,一般按内存安排字节。
例:
int a = 10000;
按文本文件存储占5个字节(当成5个字符),
按二进制存储占4字节 (10 27 00 00)
文件缓冲区
装数据,用于内存向磁盘输出数据先放到内存中的缓冲区,堆满再一块送到磁盘:或者从磁盘读取数据时先放到缓冲区,再逐个的将数据送到程序数据区
全缓冲,行缓冲,无缓冲
文件指针
包含在<stdio.h>头文件中,被定义为FILE类型数据
编写数据文件时,需要定义一个指向该结构体类型的指针。例:FILE *fp;
fp是一个指向FILE类型结构体的指针变量,
可以通过 fp指向一个文件类型的指针,从而通过该结构体变量中的文件信息访问该文件。
文件的打开与关闭
参考:c语言文件操作
fopen:打开文件,返回文件指针
fclose:关闭文件
#include<stdio.h>
int main()
{
int a = 10000;//按文本文件存储占5个字节,按二进制存储占4字节
FILE* pf = fopen("test.txt","wb");//对文件进行创建fopen和写入fwrite
fwrite(&a,4,1,pf);//写入a地址,4字节,1个数,放到pf维护的数据中去,
fclose(pf);//关闭文件
pf = NULL;
return 0;
}
打开方式:
绝对路径:明确的写出其路径。
注意 \ 会被转义,例如 \t 会被转义,可变成 \ 再转义一次, 避免转义
相对路径:
… 表示上一路径
. 表示当前路径
FILE *pf = fopen(“…\test.txt”,“r”);
指针 pf 指向 FILE 这个结构变量 ,该结构体变量维护文件;
若打开失败,则pf指向空指针
判断利用strerror(errno)
打开&关闭
#include<stdio.h>
#inlcude<string.h>
#include<errno.h> //注意头文件
int main() {
FILE *pf = fopen("test.txt","r");//只读
if(pf == NULL) { //判断指针1是否指向空
printf("%s\n",strerror(errno));//报错
return 0;
}
fclose(pf);
pf = NULL;
return 0;
}
注意文档需要和该程序放同一路径。
若对已有的文档进行写,会清空该文档,新建文件,造成覆盖写
文件的顺序读写*
字符输入输出:fgetc(),fputc()
写:fputc(‘G’,pfWrite);写入文件或打印到屏幕上
FILE* pfWrite = fopen("test.txt","w"); //向文件写入
if(pfWrite == NULL) {
printf("%s\n",strerror(errno));
return 0;
}
fputc('G',pfWrite);
fputc('Y',pfWrite);
fputc('P',pfWrite); //写入
fclose(pfWrite); //关闭文件
pfWrite = NULL;
读:fgetc(),可以读文件,或向屏幕上写
FILE* pfRead = fopen("test.txt","r");
if(pfRead == NULL) {
printf("%s\n",strerror(errno));
return 0;
}
printf("%c",fgetc(pfRead));
printf("%c",fgetc(pfRead));
printf("%c",fgetc(pfRead));//形式1
//读文件1.fgetc
// int ch = fgetc(pf);//"r"
// printf("%c",ch);
// ch = fgetc(pf);
// printf("%c",ch);//形式2
fclose(pfRead);
pfRead = NULL;
键盘(标准输入),屏幕(标准输出)(程序默认的流设备)都是外设,可以通过读 或写 ,到外设
程序默认打开的流设备(键盘和屏幕)
默认打开:
stdin FILE*,标准输入流
stdout FILE*, 标准输出
stderr FILE*,
引用:
int main() {
int ch = fgetc(stdin);//键盘输入
fputc(ch,stdout); //输出屏幕
return 0;
}
只能打印一个字符。
文本输入输出:fgets(),fputs()
写:fputs( )
int main()
{
FILE* pf = fopen("test.txt", "w");//打开文件
//判断打开是否会失败
if (pf == NULL) {
printf("%s\n", strerror(errno));
}
//写文件2.
fputs("hello\n",pf);//fputs没有换行
fputs("world\n",pf);
fclose(pf);
pf = NULL;
return 0;
}
读:fgets( )
int main()
{
FILE* pf = fopen("test.txt", "r");//打开文件
//判断打开是否会失败
if (pf == NULL) {
printf("%s\n", strerror(errno));
}
char buf[1024] = { 0 };
fgets(buf,1024,pf);
// printf("%s",buf);//1.buf存储了换行 打印gyp\n(换行)
puts(buf);//2.自身存在换行 //gyp\n\n
fgets(buf,1024,pf);
// printf("%s",buf); //打印hello\n
puts(buf);
fclose(pf);
pf = NULL;
return 0;
}
标准输入输出流:读取或输出一行:
int main()
{
char buf[1024] = { 0 };
fgets(buf,1024,stdin);//从标准输入流读取
fputs(buf,stdout);//输出到标准输出流
//等价于
// gets(buf);
// puts(buf);
return 0;
}
格式化的输入输出:fscanf(),fprintf()
sprintf写“w”
可以针对标准输出流或者指定文件流
struct S {
int n;
float score;
char arr[10];
};
int main() {
struct S s = { 100, 3.14f, "gyp"};
FILE* pf = fopen("test.txt", "w");
if(pf == NULL) {
return 0;
}
//格式化形式写文件
fprintf(pf, "%d %f %s", s.n, s.score, s.arr);
fclose(pf);
pf = NULL;
return 0;
}
**fscanf()**读 “r”
struct S s = { 0 };
FILE* pf = fopen("test.txt", "r");
if(pf == NULL) {
return 0;
}
fscanf(pf, "%d %f %s", &(s.n), &(s.score), &(s.arr));
printf("%d %f %s",s.n, s.score, s.arr);
//printf这里是读取到屏幕
从键盘屏幕输入输出:
struct S {
int n;
float score;
char arr[10];
};
int main() {
struct S s = { 0 };
fscanf(stdin, "%d %f %s", &(s.n), &(s.score), &(s.arr));
fprintf(stdout, "%d %f %s", s.n, s.score, s.arr);
return 0;
}
scanf printf 与 fscanf fprintf 与 sscanf sprintf区别
sscanf()读,sprintf()写到字符串中去
sprintf(),把字符串的数据转化为字符串存储到buf
sscanf(),从buf中读取格式化数据到tmp中
struct S {
int n;
float score;
char arr[10];
};
int main() {
struct S s = { 100, 3.14f, "abcdef"};
struct S tmp = { 0 };
char buf[1024] = { 0 };
sprintf(buf, "%d %.2f %s", s.n, s.score, s.arr);
printf("%s\n",buf);
sscanf(buf, "%d %f %s", &(tmp.n), &(tmp.score), &(tmp.arr));
printf("%d %f %s\n",tmp.n, tmp.score, tmp.arr);
return 0;
}
二进制的输入与输出
读:fread,写:fwrite
1.写“wb”,注意是二进制
struct S {
char name[20];
int age;
double score;
};
int main() {
struct S s = {"张三", 20, 55.6};
FILE *pf = fopen("test.txt", "wb");
if(pf == NULL) {
return 0;
}
//二进制形式写文件
fwrite(&s, sizeof(struct S), 1, pf);
//在pf中读1个大小为size的 数据放到s中去
fclose(pf);
pf = NULL;
return 0;
}
2.读“rb” fread
int main() {
// struct S s = {"张三", 20, 55.6};
struct S tmp = { 0 };
FILE *pf = fopen("test.txt", "rb");
if(pf == NULL) {
return 0;
}
//二进制形式写文件
fread(&tmp, sizeof(struct S), 1, pf);
//在pf中读1个大小为size的 数据放到tmp中去
printf("%s %d %lf\n",tmp.name, tmp.age, tmp.score);
fclose(pf);
pf = NULL;
return 0;
}