吾爱汇编论坛

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 672|回复: 68

[C/C++] 文件操作函数用法:fopen、fseek、ftell、fgets、fwrite、renameremove、fflush、

  [复制链接]

  离线 

升级   23.33%

gwgirl 发表于 2021-12-19 17:49 | 显示全部楼层 |阅读模式


本帖最后由 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");        //修改指定路径文件文件名

以下为代码使用案例:

[C] 纯文本查看 复制代码
#include        <stdio.h>
#include<stdlib.h>
#include<string.h>

        //定义个结构体我们备用,等会把结构体的数据写入文件
struct student                                                                                                                        //定义一个结构体,用于我们一会写入我们想保存的数据
{
        char name[10];                                                                                                                //用户名字用字符串数组
        unsigned int         age;                                                                                                //用户年龄用无符号整数
};        

        //我们往结构体写入二进制数据,然后保存到文件中
void in_Student()                                                                                                                //定义一个函数用来给数组写入数据,大家也可以写到main函数
{
        //给结构体输入数据
        student st[5]={ 0 };                                                                                                //定义一个结构体变量,大家应该知道结构体怎么用吧?
        for (int i = 0; i < 5; i++)
        {
                printf("please name:\n");
                scanf("%s", &st[i].name);                                                                //输入一个名字
                printf("please age:\n");
                scanf("%d", &st[i].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[10]={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[100] = { 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[100] = { 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;
}

评分

参与人数 10HB +9 THX +4 收起 理由
agan8888 + 1
pmm018 + 1
hackysh + 1
6378895 + 2 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
playboy + 1
xuesh + 1
baky1223 + 1 + 1 [快捷评语]--吃水不忘打井人,给个评分懂感恩!
brswbx201610 + 1
king51999 + 1 [快捷评语]--积极评分,从我做起。感谢分享!
taiyuanzhou + 1

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

升级   60%

taiyuanzhou 发表于 2021-12-21 13:18 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

升级   60.69%

playboy 发表于 2021-12-29 22:15 | 显示全部楼层


学会了c,php还会难吗!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

升级   15%

harygary 发表于 2022-1-22 08:40 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

升级   5%

精明保卫短靴 发表于 2022-1-22 19:45 | 显示全部楼层


再发点啊,我喜欢你发的
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

升级   5%

无辜方发带 发表于 2022-1-22 21:25 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

升级   5%

淡淡演变 发表于 2022-1-22 21:34 | 显示全部楼层


学破解防破解,这话没毛病!知进攻,才能懂防守!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

升级   5%

称心打电源 发表于 2022-1-22 22:41 | 显示全部楼层


谢了啊,啥也不说了,记心里了!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

升级   5%

忐忑保卫月饼 发表于 2022-1-22 22:43 | 显示全部楼层


感谢楼主
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

升级   50%

jESuY 发表于 2022-1-24 01:08 | 显示全部楼层


感谢楼主
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编论坛(www.52hb.com)所发布的破解补丁、注册机、逆向教程、逆向文章等,包含但不限于上述内容,仅限用于学习和研究目的,不得用于非法途径或商业行为。否则,一切后果请用户自行承担。本站内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如果您喜欢某程序,请购买正版,支持正版,获得正版优质服务。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@iCloud.com
站长微信:SharkHeng


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编论坛 ( 京公网安备11011502005403号 , 京ICP备20003498号 )

GMT+8, 2022-5-23 18:34 , Processed in 0.313586 second(s), 77 queries .

Powered by Discuz!

吾爱汇编论坛 www.52hb.com

快速回复 返回顶部 返回列表