#include<stdio.h>
void fileOpenAndClose();
void readFileChar();
void writeFileChar();
void readFileStr();
void formatWrite();
void formatRead();
void binaryWrite();
void binaryRead();
void seek();
size_t fileSize(const char* fileName);
void test()
{
FILE* fp = fopen("test.dat", "wb+");
if (!fp)
{
perror("file open failed");
return;
}
int size = 1256;
fwrite(&size, sizeof(int), 1, fp);
//文件的位置指针
//1256
rewind(fp);
int nsize = 0;
fread(&nsize, sizeof(int), 1, fp);
fclose(fp);
}
int main()
{
//fileOpenAndClose();
//readFileChar();
//writeFileChar();
//readFileStr();
//formatWrite();
//formatRead();
//binaryWrite();
//binaryRead();
//test();
//seek();
size_t size = fileSize("VIP13.txt");
printf("size %u", size);
return 0;
}
//文件打开与关闭
void fileOpenAndClose()
{
//打开文件
FILE* fp = fopen("C:/Windows/苍老师.txt", "r");
//判断是否打开成功
if (fp == NULL)
{
//看一下是什么原因导致的错误
perror("file open failed ");
return;
}
//关闭文件
fclose(fp);
}
//按字符读取
void readFileChar()
{
FILE* fp = fopen("demo.txt", "r");
if (fp == NULL)
{
perror("file open failed ");
return;
}
//打开成功开始操作文件
//从文件中一个一个字符的读取
//char ch = fgetc(fp);
//putchar(ch);
//啥时候结束,EOF
/* //1,
while (1)
{
char ch = fgetc(fp);
if (ch == EOF)
{
break;
}
putchar(ch);
}*/
char ch = 0;
while ((ch = fgetc(fp)) != EOF)
{
putchar(ch);
}
fclose(fp);
}
void writeFileChar()
{
FILE* fp = fopen("demo.txt", "a");
if (fp == NULL)
{
perror("file open failed ");
return;
}
for (int i = 0; i < 26; i++)
{
fputc('a' + i, fp);
}
fclose(fp);
}
//按字符串读取
void readFileStr()
{
FILE* fp = fopen("demo.txt", "r+");
if (!fp)
{
perror("open file failed");
return;
}
char buf[512] = { 0 };
//以字符串形式读取
while (!feof(fp))
{
fgets(buf, 512, fp);
printf(buf); //乱码了:编码问题 utf8 -> gbk
}
//char* name = "\nFILE* fp = fopen(\"demo.txt\", \"r\");";
写入字符串
//int ret = fputs(name, fp);
//if (ret == EOF)
//{
// perror("\n字符串写入失败");
//}
fclose(fp);
}
//学生
typedef struct Student
{
int id;
int age;
char name[10];
}Student;
//格式化读写
void formatWrite()
{
Student bloom[47] = { {100,22,"bloom" },{1001,19,"逝川"} ,{1002,20,"hello"} ,
{1003,21,"哈哈哈"}, {1004,18,"幻阳"} };
//把这个学生信息写入文件
FILE* fp = fopen("VIP13.dunkai", "w");
if (!fp)
{
perror("file open failed");
return;
}
//写入
for (int i = 0; i < 5; i++)
{
int ret = fprintf(fp, "%d %d %s\n", bloom[i].id, bloom[i].age, bloom[i].name);
if (ret == EOF)
{
perror("write failed");
}
}
fclose(fp);
}
void formatRead()
{
Student vip[47];
//把这个学生信息写入文件
FILE* fp = fopen("VIP13.dunkai", "r");
if (!fp)
{
perror("file open failed");
return;
}
//读
for (int i = 0; i < 47; i++)
{
int ret = fscanf(fp, "%d %d %s", &vip[i].id, &vip[i].age, vip[i].name);
if (ret == EOF)
{
perror("读取错误");
break;
}
}
fclose(fp);
}
//二进制读写
void binaryWrite()
{
Student bloom[47] = { {100,22,"bloom" },{1001,19,"逝川"} ,{1002,20,"hello"} ,
{1003,21,"哈哈哈"}, {1004,18,"幻阳"} };
FILE* fp = fopen("No.1.dj", "wb"); //二进制读写要用二进制的方式打开文件
if (!fp)
{
perror("file open failed");
return;
}
//二进制写入
int ret = fwrite(bloom, sizeof(Student), 5, fp);
printf("write %d block\n", ret);
if (ferror(fp))
{
perror("error ");
}
fclose(fp);
}
void binaryRead()
{
Student vip[10];
FILE* fp = fopen("No.1.dj", "rb"); //二进制读写要用二进制的方式打开文件
if (!fp)
{
perror("file open failed");
return;
}
//读取二进制数据
int ret = fread(vip, sizeof(Student), 10, fp);
printf("ret %d \n", ret);
fclose(fp);
}
void seek()
{
FILE* fp = fopen("seek.txt", "w+");
if (!fp)
{
perror("file open failed");
return;
}
fputs("hello", fp); //写入之后文件位置指针再文件末尾
//移动文件位置指针
rewind(fp); //直接移动到文件头
fseek(fp, 2, SEEK_SET);
fseek(fp, -5, SEEK_END);
fseek(fp, 2, SEEK_CUR);
long pos = ftell(fp);
printf("pos %ld\n", pos);
char buf[512];
fgets(buf, 512, fp);
puts(buf);
fclose(fp);
}
size_t fileSize(const char* fileName)
{
FILE* fp = fopen(fileName, "r");
if (!fp)
{
return ~0; //0000 0000 1111 1111
}
fseek(fp, 0, SEEK_END);
size_t size = ftell(fp);
fclose(fp);
return size;
}