#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>//标准输入输出库
#include<stdlib.h>//系统库
#include<string.h>
#define BUF_SIZE 1024
typedef struct _STU
{
int iNum;
char acNames[20];
float fscore;
}STU;
int FwriteStr(char *pcFileName, char *pc);
int FappendStr(char *pcFileName, char *pc);
int FreadStr(char *pcFileName);
int FreadAny(char *pcFileName, int iLen);
int FwriteAny(char *pcFileName, char *pc, int iLen);
int FappendAny(char *pcFileName, char *pc, int iLen);
int FwriteStu(char *pcFileName, STU *ptStu);
int FappendStu(char *pcFileName, STU *ptStu);
int FreadStu(char *pcFileName);
int FreadNumStu(char *pcFileName, int iNum);
int main()
{
/*
文件类型:
文本文件:ASCII码文件,可识别
二进制进制:乱码,MP3,MP4
*/
/*
文件指针:用一个指针变量指向一个文件
FILE *fp;
*/
/*
通过文件指针打开和关闭文件
fopen
fclose
打开文件的模式:
1.r read; w write; a append;b binary; + r+w
2、r,只读,这个文件必须存在,否则打开出错,返回NULL
3、w,只写,如果这个文件已经存在,打开重写,如果不存在就会新建一个
4、a,添加,这个文件必须存在,往文件后面添加内容,原先的内容无法更改,只能添加
5、总结,只想读取内容,rb;重写文件,wb+;如果是添加内容,ab+;
*/
/*
读写文件,都会造成文件指针位置的移动,可以理解为光标的移动
*/
char acBuf[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
STU tStu[2] = { {1,"路飞老师",100}, {2,"小鱼老师",99} };
FwriteStr("config.ini","择善结构\n");
FappendStr("config.ini", "路飞老师\n");
FreadStr("config.ini");
FwriteAny("config.ini", acBuf,10 );//文件名,应该包含完整路径,否则就是当前目录下的文件
FappendAny("config.ini", acBuf,10);
FreadAny("config.ini",10);
FwriteStu("config.ini",&tStu[0]);//文件名,应该包含完整路径,否则就是当前目录下的文件
FappendStu("config.ini", &tStu[1]);
//FreadStu("config.ini");
FreadNumStu("config.ini",1);
/*
随机读写:光标的跳转
rewind(fp); 将光标移到文件首,重新读文件
fseek(fp,offset,loc) ;将光标移动到相对于loc offset大小的位置
loc : SEEK_SET 文件首 fseek(fp,20,SEEK_SET);文件首偏移20个字节的位置
SEEK_CUR 当前位置 fseek(fp,20,SEEK_CUR);文件指针当前位置偏移20个字节的位置
SEEK_END 文件尾 fseek(fp,20,SEEK_END);文件尾偏移20个字节的位置(反方向)
*/
system("pause");
return 0;
}
/*=========================
* Function :FwriteStr
* Description :写字符串到指定文件,会重写文件
* Input Para : char *pcFileName要写入的内容的文件名,char c要写入的字符
* Output Para : 无
* Return Value : 操作出错返回-1,成功返回0
===========================*/
int FwriteStr(char *pcFileName,char *pc)
{
FILE *fp;//定义文件指针
fp = fopen(pcFileName, "wb+");
/*
使用之前应该检测一下文件是否打开成功
*/
if (fp == NULL)
{
printf("[%s]文件打开失败\n", pcFileName);
return -1;
}
fputs(pc, fp);//写入字符串,字符串专用
fclose(fp);//关闭文件
return 0;
}
/*=========================
* Function :FappendStr
* Description :添加一个字符串到指定文件
* Input Para : char *pcFileName要写入的内容的文件名,char c要写入的字符
* Output Para : 无
* Return Value : 操作出错返回-1,成功返回0
===========================*/
int FappendStr(char *pcFileName, char *pc)
{
FILE *fp;//定义文件指针
fp = fopen(pcFileName, "ab+");
/*
使用之前应该检测一下文件是否打开成功
*/
if (fp == NULL)
{
printf("[%s]文件打开失败\n", pcFileName);
return -1;
}
fputs(pc, fp);
fclose(fp);//关闭文件
return 0;
}
/*=========================
* Function :FreadStr
* Description :一行一行读出来,并打印
* Input Para : char *pcFileName要写入的内容的文件名
* Output Para : 无
* Return Value : 操作出错返回-1,成功返回0
===========================*/
int FreadStr(char *pcFileName)
{
FILE *fp;//定义文件指针
char pcBuf[BUF_SIZE] = { 0 };
fp = fopen(pcFileName, "rb");
/*
使用之前应该检测一下文件是否打开成功
*/
if (fp == NULL)
{
printf("[%s]文件打开失败\n", pcFileName);
return -1;
}
/*遍历文件*/
while (!feof(fp))//feof 如果到达文件尾,就返回0,EOF
{
fgets(pcBuf, BUF_SIZE,fp);//读取BUF_SIZE个字符到pcBuf中,遇到换行符或者文件尾就提前结束(读取一行)
printf("%s", pcBuf);
memset(pcBuf, 0, BUF_SIZE);//将BUF_SIZE个0赋值到pcBuf中,清空数组
}
fclose(fp);//关闭文件
return 0;
}
/*=========================
* Function :FwriteStr
* Description :写任意内容到指定文件,会重写文件
* Input Para : char *pcFileName要写入的内容的文件名
* Output Para : 无
* Return Value : 操作出错返回-1,成功返回0
===========================*/
int FwriteAny(char *pcFileName, char *pc,int iLen)
{
FILE *fp;//定义文件指针
fp = fopen(pcFileName, "wb+");
/*
使用之前应该检测一下文件是否打开成功
*/
if (fp == NULL)
{
printf("[%s]文件打开失败\n", pcFileName);
return -1;
}
fwrite(pc, sizeof(char), iLen, fp);//数据块的大小(一般是类型大小)size,块的个数n,实际写入size*n
fclose(fp);//关闭文件
return 0;
}
int FappendAny(char *pcFileName, char *pc, int iLen)
{
FILE *fp;//定义文件指针
fp = fopen(pcFileName, "ab+");
/*
使用之前应该检测一下文件是否打开成功
*/
if (fp == NULL)
{
printf("[%s]文件打开失败\n", pcFileName);
return -1;
}
fwrite(pc, sizeof(char), iLen, fp);//数据块的大小(一般是类型大小)size,块的个数n,实际写入size*n
fclose(fp);//关闭文件
return 0;
}
/*=========================
* Function :FreadStr
* Description :怎么写进去的怎么读出来,才能保证读出来的内容跟写入的一致,并打印
* Input Para : char *pcFileName要写入的内容的文件名
* Output Para : 无
* Return Value : 操作出错返回-1,成功返回0
===========================*/
int FreadAny(char *pcFileName,int iLen)
{
FILE *fp;//定义文件指针
char pcBuf[BUF_SIZE] = { 0 };
int i;
fp = fopen(pcFileName, "rb");
/*
使用之前应该检测一下文件是否打开成功
*/
if (fp == NULL)
{
printf("[%s]文件打开失败\n", pcFileName);
return -1;
}
/*遍历文件*/
while (!feof(fp))//feof 如果到达文件尾,就返回0,EOF
{
//读取BUF_SIZE*size个字符到pcBuf中,遇到文件尾就提前结束
fread(pcBuf, sizeof(char), iLen, fp);
for (i = 0; i < iLen; i++)
{
printf("%d ", pcBuf[i]);
}
memset(pcBuf, 0, BUF_SIZE);//将BUF_SIZE个0赋值到pcBuf中,清空数组
}
fclose(fp);//关闭文件
return 0;
}
int FwriteStu(char *pcFileName, STU *ptStu)
{
FILE *fp;//定义文件指针
fp = fopen(pcFileName, "wb+");
/*
使用之前应该检测一下文件是否打开成功
*/
if (fp == NULL)
{
printf("[%s]文件打开失败\n", pcFileName);
return -1;
}
fwrite(ptStu, sizeof(STU), 1, fp);//数据块的大小(一般是类型大小)size,块的个数n,实际写入size*n
fclose(fp);//关闭文件
return 0;
}
int FappendStu(char *pcFileName, STU *ptStu)
{
FILE *fp;//定义文件指针
fp = fopen(pcFileName, "ab+");
/*
使用之前应该检测一下文件是否打开成功
*/
if (fp == NULL)
{
printf("[%s]文件打开失败\n", pcFileName);
return -1;
}
fwrite(ptStu, sizeof(STU), 1, fp);//数据块的大小(一般是类型大小)size,块的个数n,实际写入size*n
fclose(fp);//关闭文件
return 0;
}
/*=========================
* Function :FreadStr
* Description :怎么写进去的怎么读出来,才能保证读出来的内容跟写入的一致,并打印
* Input Para : char *pcFileName要写入的内容的文件名
* Output Para : 无
* Return Value : 操作出错返回-1,成功返回0
===========================*/
int FreadStu(char *pcFileName)
{
FILE *fp;//定义文件指针
STU tStu = { 0 };
fp = fopen(pcFileName, "rb");
/*
使用之前应该检测一下文件是否打开成功
*/
if (fp == NULL)
{
printf("[%s]文件打开失败\n", pcFileName);
return -1;
}
/*遍历文件*/
while (!feof(fp))//feof 如果到达文件尾,就返回0,EOF
{
//读取BUF_SIZE*size个字符到pcBuf中,遇到文件尾就提前结束
fread(&tStu, sizeof(STU), 1, fp);
if (tStu.iNum > 0)
{
printf("学号:%d;姓名:%s;分数:%f\n", tStu.iNum, tStu.acNames, tStu.fscore);
}
memset(&tStu, 0, sizeof(STU));//将BUF_SIZE个0赋值到pcBuf中,清空数组
}
fclose(fp);//关闭文件
return 0;
}
int FreadNumStu(char *pcFileName,int iNum)
{
FILE *fp;//定义文件指针
STU tStu = { 0 };
fp = fopen(pcFileName, "rb");
/*
使用之前应该检测一下文件是否打开成功
*/
if (fp == NULL)
{
printf("[%s]文件打开失败\n", pcFileName);
return -1;
}
fseek(fp, sizeof(STU)*iNum, SEEK_SET);//跳过iNum个学生
/*遍历文件*/
while (!feof(fp))//feof 如果到达文件尾,就返回0,EOF
{
fread(&tStu, sizeof(STU), 1, fp);
if (tStu.iNum > 0)
{
printf("学号:%d;姓名:%s;分数:%f\n", tStu.iNum, tStu.acNames, tStu.fscore);
}
memset(&tStu, 0, sizeof(STU));//将BUF_SIZE个0赋值到pcBuf中,清空数组
}
fclose(fp);//关闭文件
return 0;
}