打开文件的方式
含义
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/Desktop/3.txt";
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/Desktop/3.txt";
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/Desktop/2.txt";
//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/Desktop/2.txt";
//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");
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");
return 0;
}