C:通过fwrite和fread读写数据结构

1.头文件

#include <stdio.h>

2.fopen()函数

调用fopen()函数可以打开或创建一个文件。

FILE *fopen(const char *path, const char *mode);

path : 参数 path 指向文件路径,可以是绝对路径、也可以是相对路径。

mode : 参数 mode 指定了对该文件的读写权限,是一个字符串。

返回值: 调用成功返回一个指向 FILE 类型对象的指针( FILE * ),该指针与打开或创建的文件相关联, 后续的标准 I/O 操作将围绕 FILE 指针进行。如果失败则返回 NULL ,并设置 errno 以指示错误原因。

3.fread()函数

当使用 fopen() 库函数打开文件之后,我们便可以使用 fread() 库函数对文件进行读操作

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

ptr:fread()将读取到的数据存放在参数 ptr 指向的缓冲区中;

size:fread()从文件读取 nmemb 个数据项,每一个数据项的大小为 size 个字节,所以总共读取的数据大小为 nmemb * size 个字节。

nmemb:参数 nmemb 指定了读取数据项的个数。

stream:FILE 指针。

返回值:调用成功时返回读取到的数据项的数目(数据项数目并不等于实际读取的字节数,除非参数 size 等于 1);如果发生错误或到达文件末尾,则 fread()返回的值将小于参数 nmemb,那么到底发生了错误 还是到达了文件末尾,fread()不能区分文件结尾和错误,究竟是哪一种情况,此时可以使用 ferror()或 feof() 函数来判断。

4.fwrite()函数

对文件进行写操作

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

ptr : 将参数 ptr 指向的缓冲区中的数据写入到文件中。

size : 参数 size 指定了每个数据项的字节大小,与 fread() 函数的 size 参数意义相同。

nmemb : 参数 nmemb 指定了写入的数据项个数,与 fread() 函数的 nmemb 参数意义相同。

stream : FILE 指针。

返回值: 调用成功时返回写入的数据项的数目(数据项数目并不等于实际写入的字节数,除非参数 size 等于 1 );如果发生错误,则 fwrite() 返回的值将小于参数 nmemb (或者等于 0 )。

5.fclose()函数

调用 fclose()库函数可以关闭一个由 fopen() 打开的文件。

int fclose(FILE *stream);

参数 stream 为 FILE 类型指针,调用成功返回 0 ;失败将返回 EOF (也就是 -1 ),并且会设置 errno 来指示错误原因。

可以根据函数的返回值判断文件是否关闭成功。

6.打开文件标识说明:

 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:

r(read): 读

w(write): 写

a(append): 追加

t(text): 文本文件,可省略不写

b(banary): 二进制文件

+: 读和写

组合含义:

"r" 打开一个用于读取的文件。该文件必须存在。

"w" 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。

"a" 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。

"r+" 打开一个用于更新的文件,可读取也可写入。该文件必须存在。

"w+" 创建一个用于读写的空文件。

"a+" 打开一个用于读取和追加的文件。

"rt" 只读打开一个文本文件,只允许读数据

"wt" 只写打开或建立一个文本文件,只允许写数据

"at" 追加打开一个文本文件,并在文件末尾写数据

"rb" 只读打开一个二进制文件,只允许读数据

"wb" 只写打开或建立一个二进制文件,只允许写数据

"ab" 追加打开一个二进制文件,并在文件末尾写数据

"rt+" 读写打开一个文本文件,允许读和写

"wt+" 读写打开或建立一个文本文件,允许读写

"at+" 读写打开一个文本文件,允许读,或在文件末追加数据

"rb+" 读写打开一个二进制文件,允许读和写

"wb+" 读写打开或建立一个二进制文件,允许读和写

"ab+" 读写打开一个二进制文件,允许读,或在文件末追加数据

补充:

(1)二进制标志,文本标志,在linux下是没有区别的

(2)可以用hexdump -C 文件名 命令查看二进制文件的十六进制编码

6.fseek函数

作用:调节文件指针位置,用来设置打开文件中光标的位置。

int fseek(FILE * _File, long _Offset, int _Origin);

_File:为文件指针。

offset:为偏移量,正数表示正向偏移,负数表示负向偏移。

origin:设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、SEEK_END或SEEK_SET。

7.ftell函数

ftell函数用于得到文件位置指针当前位置相对与文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。

long len = ftell(fp)

8.使用案例(QT)

结构体:

struct Student
    {
        char number[20];
        char name[20];
        int age;
        bool isman;
        char phone[13];
        char like[64];
    };

写入数据

    Student student;
    memset(&student, 0, sizeof(Student));
 
    strcpy(student.number,"20170856");
    strcpy(student.name,"张三");
    student.age = 20;
    strcpy(student.phone,"17765852634");
    strcpy(student.like,"睡觉睡觉睡觉睡觉睡觉");
    student.isman = true;
 
    FILE *fp = fopen("test", "w+");
    int size = fwrite((char *)&student, 1, sizeof(Student), fp);
    if(size)
    {
        qDebug()<<"数据保存成功。";
    }
    fclose(fp);

读取数据:

    FILE *fp = fopen("test", "r");
    Student student;
    int size = fread((char*)&student, 1, sizeof(Student), fp);
    qDebug()<<size;
    fclose(fp);
 
    ui->textEdit->append(QString("number:%1").arg(student.number));
    ui->textEdit->append(QString("name:%1").arg(student.name));
    ui->textEdit->append(QString("isman:%1").arg(student.isman));
    ui->textEdit->append(QString("age:%1").arg(student.age));
    ui->textEdit->append(QString("phone:%1").arg(student.phone));
    ui->textEdit->append(QString("like:%1").arg(student.like));

批量数据的写入和读取

    //写入
    Student student;
    memset(&student, 0, sizeof(Student));
    strcpy(student.number,"20170856");
    strcpy(student.name,"张三");
    student.age = 20;
    strcpy(student.phone,"17765852634");
    strcpy(student.like,"睡觉睡觉睡觉睡觉睡觉");
    student.isman = true;
    FILE *fp = fopen("test", "w+");
 
    for(int i = 0;i<15;i++)
    {
        student.age += i;
        int size = fwrite((char *)&student, 1, sizeof(Student), fp);
        if(size)
        {
            qDebug()<<"数据保存成功。";
        }
    }
 
    fclose(fp);
 
 
 
    //读取
    FILE *fp = fopen("test", "r");
    fseek(fp,0,2);
    int size = ftell( fp ) / sizeof(Student);
    qDebug()<<size;
    fseek(fp,0,0);
    for(int i = 0;i<size;i++)
    {
        Student student;
        int size = fread((char*)&student, 1, sizeof(Student), fp);
        qDebug()<<size;
        
        ui->textEdit->append(QString("number:%1").arg(student.number));
        ui->textEdit->append(QString("name:%1").arg(student.name));
        ui->textEdit->append(QString("isman:%1").arg(student.isman));
        ui->textEdit->append(QString("age:%1").arg(student.age));
        ui->textEdit->append(QString("phone:%1").arg(student.phone));
        ui->textEdit->append(QString("like:%1").arg(student.like));
    }
    
    fclose(fp);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/641231.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React useState数组新增和删除项

在React中&#xff0c;我们可以使用useState钩子来管理组件的状态&#xff0c;其中包括数组。如何在React函数组件中对数组进行增加和删除项的操作&#xff1f; 新增项时&#xff1a;我们可以对原数组进行解构&#xff0c;并把新增项一起加入到新数组&#xff1b; 删除项时&…

JDBC(Java DataBase Connectivity)Java数据库连接

JDBC(Java DataBase Connectivity) Java 语言连接数据库 再本模块中,java提供里一组用于连接数据库的类和接口Java 语言开发者,本身没有提供如何具体连接数据库的功能只是定义了一组java程序连接数据库的访问接口 连接到数据库向数据库发送增,修改,删除这一类的sql发送查询sq…

CATIA入门操作——为什么大佬的工具栏是水平的?如何把工具栏变水平?

目录 引出工具栏怎么变成水平&#xff1f;总结发生肾么事了&#xff1f;&#xff1f;鼠标中键旋转不了解决&#xff1a;特征树不显示参数关系 我的窗口去哪了&#xff1f;插曲&#xff1a;草图工具的调出插曲&#xff1a;颜色工具栏显示 弹窗警告警告&#xff1a;创建约束是临时…

linux系统介绍

Linux是一种免费使用和自由传播的类Unix操作系统&#xff0c;它是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。Linux起源于1991年&#xff0c;由芬兰程序员林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;创建&#xff0c;并迅速获得了全球开发者…

香橙派华为昇腾CANN架构编译opencv4.9

香橙派华为升腾AI盒子 为啥要编译opencv4.9.0&#xff0c; 因为在4.9.0 中增加了华为昇腾CANN的外接开发库&#xff0c;下图为盒子外观&#xff0c;此次一接到这个盒子&#xff0c;立刻开始开箱操作&#xff0c;首先就是要编译opencv4.9&#xff0c;以前在香橙派3588 的盒子中…

抖音极速版:抖音轻量精简版本,新人享大福利

和快手一样&#xff0c;抖音也有自己的极速版&#xff0c;可视作抖音的轻量精简版&#xff0c;更专注于刷视频看广告赚钱&#xff0c;收益比抖音要高&#xff0c;可玩性更佳。 抖音极速版简介 抖音极速版是一个提供短视频创业和收益任务的平台&#xff0c;用户可以通过观看广…

当前时机是否适合进入 AIGC 行业:行业发展与市场需求分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

下一代Docker会让部署更丝滑吗

下一代Docker会让部署更丝滑吗 如何通俗易懂的理解DockerDocker有什么缺点Docker与AI结合&#xff0c;会让部署更加丝滑吗 随着互联网技术的不断发展&#xff0c;单机系统已经无法满足日益正常的用户量以及正常处理用户请求&#xff0c;这个时候就需要进行多机部署&#xff0c;…

贝锐向日葵打造农机设备远程运维支持方案

当物联网“万物互联”的概念向第一产业赋能&#xff0c;农机设备的智能化程度也越来越高。 所谓农业物联网&#xff0c;即在应用层将大量的传感器节点构成监控网络&#xff0c;通过各种传感器采集信息&#xff0c;以帮助农民及时发现问题&#xff0c;并准确地判定发生问题的位…

1099: 希尔排序算法实现

解法&#xff1a; 希尔增量选定n/2&#xff0c; #include<iostream> #include<vector> using namespace std; int main() {int n;cin >> n;vector<int> vec(n);for (int i 0; i < n; i) cin >> vec[i];int d n / 2;for (int i 0; i <…

【C语言】指针运算

前言 前面在“走进指针世界”中我已经讲解过指针相关的很多前置知识&#xff0c;其实还有一个很重要的部分就是指针的运算。这篇博客&#xff0c;就让我们一起了解一下指针的运算吧&#xff01; 指针作为变量&#xff0c;是可以进行算术运算的&#xff0c;只不过情况会和整型…

上门服务系统开发|东邻到家系统|上门服务系统开发流程

上门服务小程序的开发流程是一个复杂且精细的过程&#xff0c;涉及到需求分析、设计规划、开发实施、测试验收以及上线运营等多个环节。下面将详细介绍上门服务小程序的开发流程&#xff0c;帮助读者全面了解并掌握其中的关键步骤。 一、需求分析 在开发上门服务小程序之前&am…

RedisTemplateAPI:String

文章目录 ⛄1 String 介绍⛄2 命令⛄3 对应 RedisTemplate API❄️❄️ 3.1 添加缓存❄️❄️ 3.2 设置过期时间(单独设置)❄️❄️ 3.3 获取缓存值❄️❄️ 3.4 删除key❄️❄️ 3.5 顺序递增❄️❄️ 3.6 顺序递减 ⛄4 以下是一些常用的API⛄5 应用场景 ⛄1 String 介绍 Str…

hive3从入门到精通(一)

Hive3入门至精通(基础、部署、理论、SQL、函数、运算以及性能优化)1-14章 第1章:数据仓库基础理论 1-1.数据仓库概念 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;,是一个用于存储、分析、报告的数据系统。 数据仓库的目的是构…

世界上首位AI程序员诞生,AI将成为人类的对手吗?

3月13日&#xff0c;世界上第一位AI程序员Devin诞生&#xff0c;不仅能自主学习新技术&#xff0c;自己改Bug&#xff0c;甚至还能训练和微调自己的AI模型&#xff0c;表现已然远超GPT-4等“顶流选手”。 AI的学习速度如此之快&#xff0c;人类的教育能否跟上“机器学习”的速…

3100点失守,小丑竟是我自己

敏感时刻&#xff0c;亮剑的我们股市买单&#xff0c;海的那边反倒还涨了&#xff0c;好生气啊&#xff01;就连我们胡主编昨晚都气得睡不着&#xff0c;一点多了还在那抒发情感&#xff0c; 确实&#xff0c;有句话说到心窝里了&#xff1a;小散们是拿真金白银撑场子的&#x…

瑞芯微RV1126——ffmpeg环境搭建

本篇文章来介绍一下&#xff0c;在ubuntu上搭建一个比较完整的ffmpeg环境需要的步骤以及流程。为后期将我们开发的应用程序移植到RV1126开发板上做准备。 在安装ffmpeg之前&#xff0c;为了方便后续的操作&#xff0c;我们可以先搭建好samba服务器。所以本节将分为两个部分&am…

Java中的继承和多态

继承 在现实世界中&#xff0c;狗和猫都是动物&#xff0c;这是因为他们都有动物的一些共有的特征。 在Java中&#xff0c;可以通过继承的方式来让对象拥有相同的属性&#xff0c;并且可以简化很多代码 例如&#xff1a;动物都有的特征&#xff0c;有名字&#xff0c;有年龄…

人生苦短,我学python之数据类型(上)

个人主页&#xff1a;星纭-CSDN博客 系列文章专栏&#xff1a;Python 踏上取经路&#xff0c;比抵达灵山更重要&#xff01;一起努力一起进步&#xff01; 目录 一.元组 &#xff08;tuple&#xff09; 二.集合&#xff08;set&#xff09; 三.字典(dict) 一.元组 &#…

WPF密码输入框明文掩码切换

1&#xff0c;效果 2&#xff0c;代码&#xff1a; WPF的PasswordBox不能像Winform中的PasswordBox那样&#xff0c;通过PasswordBox.PasswordChar(char)0显示明文。所以这里使用无外观控件构筑掩码明文切换。 无外观控件遵守Themes/Generic.xaml文件配置. <ResourceDicti…