gwgirl 发表于 2021-12-19 17:49

文件操作函数用法: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;
}

taiyuanzhou 发表于 2021-12-21 13:18

感谢楼主分享

playboy 发表于 2021-12-29 22:15

学会了c,php还会难吗!

harygary 发表于 2022-1-22 08:40

每天都能学到新知识,赞!

精明保卫短靴 发表于 2022-1-22 19:45

再发点啊,我喜欢你发的

无辜方发带 发表于 2022-1-22 21:25

刚需啊,一定要看看!

淡淡演变 发表于 2022-1-22 21:34

学破解防逆向,这话没毛病!知进攻,才能懂防守!

称心打电源 发表于 2022-1-22 22:41

谢了啊,啥也不说了,记心里了!

忐忑保卫月饼 发表于 2022-1-22 22:43

感谢楼主

jESuY 发表于 2022-1-24 01:08

感谢楼主
页: [1] 2 3 4 5 6 7
查看完整版本: 文件操作函数用法:fopen、fseek、ftell、fgets、fwrite、renameremove、fflush、