文件操作函数用法:fopen、fseek、ftell、fgets、fwrite、renameremove、fflush、
本帖最后由 gwgirl 于 2021-12-19 17:50 编辑1、fopen函数:打开文件;
FILE* pFile = fopen("nr1001.txt","w");
if (pFile == NULL)
{
return -1;
}
2、fseek函数:设置指针指向文件位置;
1、SEEK_SET:从文件开头开始
2、SEEK_CUR:从当前位置开始
3、SEEK_END:从文件末尾开始
3、ftell函数:指针当前所在位置在第几个字节;
也可以利用这个函数获取到文件晕晕晕有多少个字节;
printf("ftell = %d\n",ftell(p));
4、fgets函数;将读取到底数据写入内存数组
while (!feof(Rfile))
{
fgets(buf, sizeof(buf), Rfile); //把读到底数据写入到buf数组中
printf("buf = %s\n", buf); //打印buf的内容到显示器
}
5、fwrite:将内存中的内容,写入文件中
char szMsg[] = "hello\r\nworld";
fwrite(szMsg, sizeof(char), strlen(szMsg), pFile);
6、fclose函数:关闭文件
fclose(Rfile); //Rfile 是定义都一个指针
//文件执行完成我们关闭文件,这是必须的操作步骤,用的时候打开,不用了就要关闭
7、fflush函数:
一般修改重要数据,使用,防止中途意外关闭无法保存
好处:相当于即时保存内容到磁盘
坏处:效率低,硬盘读取次数增加,磁盘使用寿命变短
fflush函数 //即时将缓存区的内容立刻写入磁盘
每当程序通过C语言库函数往文件里面写数据,C语言库函数并不是实时的将数据直接
写入磁盘,而是放到内存里,当内存满了或是明确调用了fclose才将数据一次性写入
磁盘。减少磁盘读取次数。C语言所有的操作函数都是缓存区函数
8、remove 函数
//remove("file1.txt"); //删除指定路径文件
9、rename函数
//rename("file1.txt", "file3.txt"); //修改指定路径文件文件名
以下为代码使用案例:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
//定义个结构体我们备用,等会把结构体的数据写入文件
struct student //定义一个结构体,用于我们一会写入我们想保存的数据
{
char name; //用户名字用字符串数组
unsigned int age; //用户年龄用无符号整数
};
//我们往结构体写入二进制数据,然后保存到文件中
void in_Student() //定义一个函数用来给数组写入数据,大家也可以写到main函数
{
//给结构体输入数据
student st={ 0 }; //定义一个结构体变量,大家应该知道结构体怎么用吧?
for (int i = 0; i < 5; i++)
{
printf("please name:\n");
scanf("%s", &st.name); //输入一个名字
printf("please age:\n");
scanf("%d", &st.age); //输入一个年龄
}
//开始写入文本文件
FILE* pFile = fopen("file.dat", "wb"); //在项目目录打开一个file.dat的文件,wb:以只写模式建立二进制文本
if (pFile == NULL) //这里呢要进行一个判断,检测我们是否正确打开或建立文件
{ //一定要判断,万一失败我们写哪?养成好习惯
printf("open error!"); //提示没有打开文件
}
else
{
fwrite(st, sizeof(struct student), 5, pFile); //我们现在把struct student结构体的数据写入到 file.txt的文件中 一次写入5个
printf("写入成功\n"); //友善提示下看看写入成功没有
fclose(pFile); //文件执行完成我们关闭文件,释放空间,这是必须的操作步骤,用的时候打开,不用了就要关闭
pFile = NULL; //用完后把我们定义都指针指向空,避免后面万一用了重名指针出错;
}
}
//定义个结构体我们备用,等会把结构体的数据写入文件
struct Rstudent //定义一个结构体,用于我们一会写入我们想保存的数据
{
char name={0}; //用户名字用字符串数组
unsigned int age=0; //用户年龄用无符号整数
};
//读取一个文件并打印
void R2file() //我们在写一个读取文件的函数
{
struct Rstudent rst = {0};
FILE* Rfile = fopen("file.dat", "rb"); //以只读方式打开文件
if (Rfile == NULL) //这里呢要进行一个判断,检测我们是否正确打开或建立文件
{ //一定要判断,万一失败我们写哪?养成好习惯
printf("open error!"); //提示没有打开文件
}
else
{
//fseek 第一个参数文档指针 第二个参数代表偏移地址 第三个参数
fseek(Rfile,sizeof(struct Rstudent)*2,SEEK_SET); //向文件开始位置向后偏移Rstudent结构大小字节 *表示向后两个结构体大小
memset(&rst, 0, sizeof(struct Rstudent)); //读数据之前我们把struct Rstudent结构体数据清空一下
fread(&rst, sizeof(struct Rstudent), 1, Rfile); //我们开始将一个的读取数据如果读到空行就不在读取
printf("name : %s \t age : %d \t 读取成功\n", rst.name, rst.age);//打印我们读取到的信息
fseek(Rfile, 0 - sizeof(struct Rstudent)*2 , SEEK_CUR);//从当前位置往回偏移Rstudent结构大小字节 0- *2表示往回两个结构体大小
memset(&rst, 0, sizeof(struct Rstudent)); //读数据之前我们把struct Rstudent结构体数据清空一下
fread(&rst, sizeof(struct Rstudent), 1, Rfile); //我们开始将一个的读取数据如果读到空行就不在读取
printf("name : %s \t age : %d \t 读取成功\n", rst.name, rst.age);//打印我们读取到的信息
fseek(Rfile, 0- sizeof(struct Rstudent)*2, SEEK_END); //从末尾位置往回偏移Rstudent结构大小字节 0- *2表示往回2个结构体大小
memset(&rst, 0, sizeof(struct Rstudent)); //读数据之前我们把struct Rstudent结构体数据清空一下
fread(&rst, sizeof(struct Rstudent), 1, Rfile); //我们开始将一个的读取数据如果读到空行就不在读取
printf("name : %s \t age : %d \t 读取成功\n", rst.name, rst.age);//打印我们读取到的信息
//while (1)//把内容都读出来写到结构体里
//{
// memset(&rst, 0, sizeof(struct Rstudent));//读数据之前我们把struct Rstudent结构体数据清空一下
// if (fread(&rst, sizeof(struct Rstudent), 1, Rfile)==0)//我们开始一个一个的读取数据如果读到空行就不在读取
// {
// break;
// }
// printf("name : %s \t age : %d \t 读取成功\n", rst.name, rst.age);//打印我们读取到的信息.
//
//}
fclose(Rfile); //文件执行完成我们关闭文件,释放空间,这是必须的操作步骤,用的时候打开,不用了就要关闭
Rfile = NULL; //用完后把我们定义都指针指向空,避免后面万一用了重名指针出错;
}
}
void Rtxtfile()
{
FILE* Rfile = fopen("file1.txt", "rb"); //在项目目录打开或一个file1.txt的文件,wb:以只写模式建立二进制文本
if (Rfile == NULL) //这里呢要进行一个判断,检测我们是否正确打开或建立文件
{ //一定要判断,万一失败我们写哪?养成好习惯
printf("open error!"); //提示没有打开文件
}
else
{
//单行读取
//fseek(Rfile, 2, SEEK_SET); //从开始跳过两个字节开始读取数据
//fseek(Rfile, -10, SEEK_END); //从后向前取10个数据读取
char buf = { 0 }; //定义一个字符数组存放读出来的内容
//fgets(buf, sizeof(buf), Rfile); //把读到底数据写入到buf数组中
//printf("buf = %s\n", buf); //打印buf的内容到显示器
//多行读取
while (!feof(Rfile))
{
fgets(buf, sizeof(buf), Rfile); //把读到底数据写入到buf数组中
printf("buf = %s\n", buf); //打印buf的内容到显示器
}
printf("ftell = %d\n", ftell(Rfile)); //ftell函数指针当前所在位置在第几个字节
fclose(Rfile); //文件执行完成我们关闭文件,释放空间,这是必须的操作步骤,用的时候打开,不用了就要关闭
Rfile = NULL; //用完后把我们定义都指针指向空,避免后面万一用了重名指针出错;
}
}
//fflush函数的使用 即时保存到磁盘
void RWfile()
{
FILE* Rfile = fopen("file2.txt", "w"); //在项目目录打开或新建一个file2.txt的文件,w:以只写模式建立二进制文本
if (Rfile == NULL) //这里呢要进行一个判断,检测我们是否正确打开或建立文件
{ //一定要判断,万一失败我们写哪?养成好习惯
printf("open error!"); //提示没有打开文件
}
else
{
while (1)
{
char buf = { 0 };
scanf("%s", buf);
if (strcmp(buf, "exit") == 0) //如果用户输入exit循环就退出
{
break;
}
fprintf(Rfile, "%s\n", buf);
fflush(Rfile); //即时将缓存区的内容写入磁盘
}
fclose(Rfile); //文件执行完成我们关闭文件,释放空间,这是必须的操作步骤,用的时候打开,不用了就要关闭
Rfile = NULL; //用完后把我们定义都指针指向空,避免后面万一用了重名指针出错;
}
}
//remove函数
//remove("file1.txt") ; //删除指定路径文件
//rename("file1.txt", "file3.txt") //修改指定路径文件文件名
int main()
{
//in_Student();
//R2file();
//Rtxtfile();
RWfile();
return 0;
}
感谢楼主分享 学会了c,php还会难吗! 每天都能学到新知识,赞! 再发点啊,我喜欢你发的 刚需啊,一定要看看! 学破解防逆向,这话没毛病!知进攻,才能懂防守! 谢了啊,啥也不说了,记心里了! 感谢楼主 感谢楼主