⽂件的读写⽅式(按字符读写、按⾏读写、按块读写)
打开⽂件的⽅式
含义
w:表⽰fopen⽂件时会清空掉原⽂件(如果存在)的信息,并重新写⼊,在不fclose⽂件的情况下,多次fwrite也是追加写⼊到⽂件末尾的,不会覆盖之前fwrite的内容。
a:表⽰fopen⽂件时会保留原⽂件(如果存在)的信息,并追加到末尾写⼊,每次fwrite写⼊到⽂件末尾。
⽂本⽅式打开的⽂件具有⼀定的格式,说明读取时是要按照⼀定的编码规范来读取的,⽽⼆进制⽅式读取是直接从⽂件中读取包含0,1的⼆进制流,没有任何格式
“r” 打开,只读
“w” 打开,⽂件指针指到头,只写
“a” 打开,指向⽂件尾,在已存在⽂件中追加
“rb” 打开⼀个⼆进制⽂件,只读
“wb” 打开⼀个⼆进制⽂件,只写
“ab” 打开⼀个⼆进制⽂件,进⾏追加
“r+” 以读/写⽅式打开⼀个已存在的⽂件
“w+” 以读/写⽅式建⽴⼀个新的⽂本⽂件
“a+” 以读/写⽅式打开⼀个⽂件⽂件进⾏追加
“rb+” 以读/写⽅式打开⼀个⼆进制⽂件
“wb+” 以读/写⽅式建⽴⼀个新的⼆进制⽂件
“ab+” 以读/写⽅式打开⼀个⼆进制⽂件进⾏追加
#define  _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<Windows.h>
typedef struct Teacher
{
char name[64];
int age;
}teacher;
void fun_fwrite()//按块的⽅式写⽂件
{
int my_count;
FILE* fp =NULL;//⽂件句柄,就是⼀个内存块的⾸地址
const char* filename ="C:/Users/ky/";
Teacher tArray[3];
for(int i =0; i <3; i++)
{
sprintf(tArray[i].name,"%d%d%d", i +1, i +1, i +1);
tArray[i].age = i +31;
printf("%s\n", tArray[i].name);
}
fp =fopen(filename,"rb+");
if(fp ==NULL)
{
printf("func fopen err\n");
return;
}
printf("func fopen right\n");
for(int i =0; i <3; i++)
{
my_count=fwrite(&tArray[i],sizeof(Teacher),1, fp);
}
if(fp !=NULL)
{
fclose(fp);
}
}
void fun_fread()//按块的⽅式读⽂件
{
int my_count;
FILE* fp =NULL;//⽂件句柄,就是⼀个内存块的⾸地址const char* filename ="C:/Users/ky/";
Teacher tArray[3];
fp =fopen(filename,"rb+");//以⼆进制读写的⽅式打开⽂件if(fp ==NULL)
{
printf("func fopen err\n");
return;
}
printf("func fopen right\n");
for(int i =0; i <3; i++)
{
my_count =fread(&tArray[i],sizeof(Teacher),1, fp);
}
for(int i =0; i <3; i++)
{
printf("name:%s, age:%d \n", tArray[i].name, tArray[i].age); }
if(fp !=NULL)
{
fclose(fp);
}
}
void fun_fpuc()//按照字符写⽂件
{
FILE* fp =NULL;//⽂件句柄,就是⼀个内存块的⾸地址const char* filename ="C:/Users/ky/";
//const char* filename = "2.txt";
char a[27]="afafhafoihfiof";
fp =fopen(filename,"r+");
if(fp ==NULL)
{
printf("func fopen err\n");
return;
}
printf("func fopen right\n");
for(int i =0; i <strlen(a); i++)
{
fputc(a[i], fp);//按字符读写⽂件
}
if(fp !=NULL)
{
fclose(fp);
}
}
void fun_fgetc()//按照字符写⽂件
{
FILE* fp =NULL;//⽂件句柄,就是⼀个内存块的⾸地址const char* filename ="C:/Users/ky/";
//const char* filename = "2.txt";
//const char* filename = "2.txt";
char a[27]="afafhafoihfiof";
fp =fopen(filename,"r+");
if(fp ==NULL)
{
fgets和fgetc的区别
printf("func fopen err\n");
return;
}
printf("func fopen right\n");
while(!feof(fp))//feof()是检测流上的⽂件结束符的函数,如果⽂件结束,则返回⾮0值,否则返回0
{
char tec =fgetc(fp);
Sleep(1);
printf("%c", tec);
}
if(fp !=NULL)
{
fclose(fp);
}
}
//fputs(a,fd)  按⾏写
//fgets(buf ,n,fd)  按⾏读,  ⼀次⼀⾏的copy数据到buf指针所指的内存空间并变成c风格的字符串把/n也拷贝到buf中int main()
{
//fun_fpuc();
// fun_fgetc();
fun_fwrite();
fun_fread();
system("pause");
return0;
}