高级编程(2)

news2025/1/25 9:25:02

今天主要讲一下这四个函数接口:fwrite、fread、fprintf、fsancf以及流的定位:ftell、rewind、fseek
函数接口

fwrite


fwrite:
    size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
    向流中写入number个对象,每个对象size字节大小,在ptr指向的空间中
参数:
    ptr:存放数据空间的首地址
    size:每个数据对象的大小
    number:数据对象的个数
    stream:文件流指针
返回值:
    成功返回写入对象的个数
    失败返回0
    读到文件末尾返回0 

例子:向file.txt文件中传入学生类型的结构体数据

#include<stdio.h>

typedef struct student{        //定义结构体
    char name[20];
    char sex;
    int age;
    int score;
}stu_x;

int main(void)        //主函数
{
    stu_x a = {"tom",'m',19,70};        //输入数据
    stu_x b = {"zero",'f',20,100};
    stu_x c[3] = {
        {"jack",'m',18,95},
        {"john",'f',19,80},
        {"lucky",'m',20,65},
    };

    FILE *fp = NULL;

    fp = fopen("file.txt","w");        //以写的方式打开文件

    if(NULL == fp)
    {
        perror("fail to fopen!");
        return -1;
    }

    fwrite(&a,sizeof(stu_x),1,fp);
    fwrite(&b,sizeof(stu_x),1,fp);
    fwrite(c,sizeof(stu_x),3,fp);

    fclose(fp);

    return 0;
}

数据已经写入文件中,但是cat只能显示ASCII码文件,不能显示二进制文件。

fread
fread:
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
    从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中
参数:
    ptr:存放读取内容空间首地址
    size:读取对象的大小
    nmemb:读取对象的个数
    stream:文件流指针 
返回值:
    成功返回读到对象个数
    失败返回0
    读到文件末尾返回0 

我们可以将刚刚写入进去的数据重新读取出来:

#include<stdio.h>

typedef struct student        //fread读取数据的话,必须得要有数据的结构体
{
    char name[20];
    char sex;
    int age;
    int score;
}stu_t;

int ShowStuInfo(stu_t tmpstu)        //以这种方式输出
{
    printf("name  = %s\n",tmpstu.name);
    printf(" sex  = %c\n",tmpstu.sex);
    printf(" age  = %d\n",tmpstu.age);
    printf("score = %d\n",tmpstu.score);
}

int main(void)
{
    FILE *p = NULL;
    size_t ret;
    int i = 0;
    stu_t a;
    stu_t b[10];
    p = fopen("file.txt","r");

    if(NULL == p)
    {
        perror("fail to fopen");
        return -1;
    }
    
    fread(&a,sizeof(stu_t),1,p);    //取a的地址
    ShowStuInfo(a);
    ret = fread(b,sizeof(stu_t),10,p);    //取数组b的地址,ret可以看到文件中还有几组数据
    for(i = 0;i < ret;++i)
    {
        ShowStuInfo(b[i]);
    }

    fclose(p);

    return 0;
}


结果:

我们可以看到,再进行第二个fread时,我们写入的读取对象的个数是10,但是实际上只有4个,所以最后ret等于4。

fprintf
fprintf 
    int fprintf(FILE *stream, const char *format, ...);
功能:
    将格式化字符串输出到stream指向的流中

我的个人观点,认为这个实际上跟printf一样,只不过输入时需要加文件流指针,下面举一个例子:

#include<stdio.h>

int main(void)
{
    FILE *p = NULL;
    int Num1 = 100;
    int Num2 = 200;

    p = fopen("file.txt","w");

    if(NULL == p)
    {
        perror("fail to fopen");
        return -1;
    }

    fprintf(p,"hello world!\n num1 = %d , num2 = %d\n",Num1,Num2);    //将值输入到文件中

    fclose(p);

    return 0;
}


fscanf
fsancf 
    int fscanf(FILE *stream, const char *format, ...);
功能:
    从流中读取格式化的字符串

我们可以将文件中的数据进行提取出来。

第二部分就是流的定位


ftell
ftell
    long ftell(FILE *stream);
功能:
    获得流的偏移量

在进行第一次打开文件时,流的偏移量是0

rewind


rewind
    void rewind(FILE *stream);
功能:
    将流的偏移量重新设置到开头


fseek
fseek 
    int fseek(FILE *stream, long offset, int whence);
功能:
    设置流的偏移量
参数:
    stream:文件流指针
    offset:偏移量
    > 0 向后偏移
    < 0 向前偏移
whence:
    SEEK_SET    文件开头
    SEEK_CUR    文件当前位置
    SEEK_END    文件末尾

我们可以做一个简单的例子,方便于了解

#include<stdio.h>

int main(void)
{
    FILE *src = NULL;
    src = fopen("file.txt","w");

    if(NULL == src)
    {
        perror("fail to fopen");
        return -1;
    }

    fseek(src,10,SEEK_SET);        //在文件开头位置向右偏移10
    fputc('a',src);

    fseek(src,-5,SEEK_CUR);        //在文件当前位置向左偏移5
    fputc('c',src);

    fseek(src,0,SEEK_SET);        //回到文件开头位置
    fputc('b',src);

    fclose(src);
    
    return 0;
}


结果:

以上就是今天的所以内容,下面进行一个实例,从终端输入一个单词,获得单词的含义。

#include<stdio.h>
#include<string.h>

int main(void)
{
    FILE *src = NULL;
    src = fopen("dict.txt","r");    
    char word[256] = {0};
    char tmpbuff[4096];
    char *ptmp = NULL;
    char *pret = NULL;

    printf("please input one word:");
    gets(word);
    if(NULL == src)
    {
        perror("fail to fopen");
        return -1;
    }

    while(1)        //进行死循环
    {
        pret = fgets(tmpbuff,sizeof(tmpbuff),src);        //在源文件中,每一行结尾都有\n,所以我们可以使用fgets获得每一行的首地址,让pret进行记录
                                             //tmpbuff是存放字符串空间首地址,读取4096个字节,要保证足够大

        if(NULL == pret)    //判断是否读到文件末尾
        {
            break;
        }

        ptmp = tmpbuff;        

        while(*ptmp != ' ' && *ptmp != '\0')    //截取单词
        {
            ++ptmp;
        }

        *ptmp = '\0';        //将第一个空格的位置换成\0

        ptmp++;

        while(*ptmp == ' ')
        {
            ++ptmp;
        }

        if(strcmp(word,tmpbuff) == 0)    //进行字符串判断,看是否与输入的字符串相等
        {
            printf("word = %s\n",word);    //输出单词
            printf("ptmp = %s",ptmp);    //输出含义,因为已经截断了,所以ptmp当前的首地址是含义的地址
            return 0;
        }
    }

    fclose(src);

    printf("Word does not exist!\n");
    return 0;
}
结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java 课程签到管理系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 课程签到管理系统是一套完善的java web信息管理系统 采用serlvetdaobean&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0…

【漏洞复现】蓝网科技临床浏览系统信息泄露漏洞

Nx01 产品简介 蓝网科技临床浏览系统是一个专门用于医疗行业的软件系统&#xff0c;主要用于医生、护士和其他医疗专业人员在临床工作中进行信息浏览、查询和管理。 Nx02 漏洞描述 蓝网科技临床浏览系统存在信息泄露漏洞&#xff0c;攻击者可以利用该漏洞获取敏感信息。 Nx03…

C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现

介绍完了list类的相关内容后&#xff1a;C初阶&#xff1a;适合新手的手撕list&#xff08;模拟实现list&#xff09; 接下来进入新的篇章&#xff0c;stack和queue的介绍以及模拟&#xff1a; 文章目录 1.stack的初步介绍2.stack的使用3.queue的初步介绍4.queue的使用5.容器适…

简洁高效的短链接:优化互联网体验

title: 简洁高效的短链接&#xff1a;优化互联网体验 date: 2024/2/18 13:24:24 updated: 2024/2/18 13:24:24 tags: 短链接长网址缩短美观简洁分享优化点击率提升数据统计用户体验 在互联网时代&#xff0c;我们经常遇到需要分享长网址的情况。长网址不仅不美观&#xff0c;而…

java面试微服务篇

目录 目录 SpringCloud Spring Cloud 的5大组件 服务注册 Eureka Nacos Eureka和Nacos的对比 负载均衡 负载均衡流程 Ribbon负载均衡策略 自定义负载均衡策略 熔断、降级 服务雪崩 服务降级 服务熔断 服务监控 为什么需要监控 服务监控的组件 skywalking 业务…

图解支付文件网关:文件交互的底座

在上一篇《图解支付报文网关&#xff1a;一种低代码报文网关的设计思路与核心代码实现》&#xff0c;我们深入讨论了报文网关的设计与实现&#xff0c;今天和大家聊聊文件网关的设计与实现。 在这篇文章中&#xff0c;你可以了解到文件网关的作用&#xff0c;什么情况下文件网…

stable diffusion webui学习总结(2):技巧汇总

一、脸部修复&#xff1a;解决在低分辨率下&#xff0c;脸部生成异常的问题 勾选ADetailer&#xff0c;会在生成图片后&#xff0c;用更高的分辨率&#xff0c;对于脸部重新生成一遍 二、高清放大&#xff1a;低分辨率照片提升到高分辨率&#xff0c;并丰富内容细节 1、先通过…

多线程---线程同步,线程通信

线程同步 1.概述 线程同步是多线程编程中的一个重要概念&#xff0c;它指的是在多线程环境中&#xff0c;通过一定的机制保证多个线程按照某种特定的方式正确、有序地执行。这主要是为了避免并发问题&#xff0c;如死锁、竞态条件、资源争用等&#xff0c;确保数据的一致性和完…

超强!中科院1区算法改进!改进雪融优化GVSAO-CNN-BiGRU-Attention融合注意力机制预测程序代码!直接运行!

适用平台&#xff1a;Matlab2023版及以上 雪消融优化算法&#xff08;Snow Ablation Optimizer&#xff0c;SAO&#xff09;&#xff0c;于2023年6月发表在SCI、中科院1区顶级期刊《Expert Systems With Applications》上。该算法刚刚提出&#xff0c;目前还没有套用这个算法的…

【Java EE初阶十七】网络原理(二)

2. 传输层 2.2 TCP协议 2.2.2 关于可靠传输 4.滑动窗口 前面的三个机制&#xff0c;都是在保证 tcp 的可靠性&#xff1b; TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了)&#xff1b; 滑动窗口,就让可靠传输对性能的影响,更…

【摸鱼日常】使用Docker部署RPG网页小游戏

一、本次实践介绍 1. 本次实践简介 本次实践部署环境为个人测试环境&#xff0c;快速使用docker部署RPG网页小游戏。 rootWellDone:/home/goodjob# uname -a Linux WellDone 6.5.0-14-generic #14~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Nov 20 18:15:30 UTC 2 x86_64 x86_…

SG5032VAN晶体振荡器规格书

SG5032VAN是一款具备高精度、高稳定性及多功能的石英晶体振荡器,通过锁相环技术和AT晶体单元实现宽频率范围,能够满足各种应用场景的需求。频率范围从73.5 MHz到700 MHz,可以满足多种无线通信设备和系统&#xff0c;供电电压2.5V/3.3V,为用户提供了更加灵活的电源选择。还具备输…

通俗的讲解什么是机器学习之损失函数

想象一下&#xff0c;你在玩一个靶心射击的游戏&#xff0c;你的目标是尽可能让箭簇命中靶心。在这个游戏中&#xff0c;损失函数可以看作是测量你的箭簇与靶心距离的规则。损失函数的值越小&#xff0c;意味着你的箭簇离靶心越近&#xff0c;你的射击技能越好。 在机器学习中…

Mouse Anti-HDM IgE Antibody Assay Kit

哮喘作为一种常见的慢性炎症类疾病&#xff0c;影响着全世界约3亿各年龄段的人。哮喘一般是由于暴露于过敏原&#xff08;尘螨、宠物皮屑、花粉及霉菌等&#xff09;引起的&#xff0c;其特征是气流阻塞和支气管痉挛。屋尘螨&#xff08;house dust mite, HDM&#xff09;是最常…

贪心算法练习day2

删除字符 1.题目及要求 2.解题思路 1&#xff09;初始化最小字母为‘Z’&#xff0c;确保任何字母都能与之比较 2&#xff09;遍历单词&#xff0c;找到当前未删除字母中的最小字母 3&#xff09;获取当前位置的字母 current word.charAt(i)&#xff1b; 4&#xff09;删…

BUGKU-WEB 变量1

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; flag In the variable !<?php error_reporting(0); include "flag1.php"; highlight_file(__file__); if(isset($_GET[args])){$args $_GET[args];if(!preg_match("/^\w$/",$args…

深度学习系列53:大模型微调概述

参考系列文章&#xff1a;https://zhuanlan.zhihu.com/p/635152813 github链接&#xff1a;https://github.com/liguodongiot/llm-action 1 训练范式 下面这种instructive learning&#xff0c;在模型参数达到80亿后&#xff0c;会发生质的提升&#xff1a; 类似的还有手写pr…

error: ‘QWidget‘ file not found

说明你没有加载 widgets模块 缺少widgets&#xff0c;就报错

【Java EE初阶十二】网络原理(二)

2. 传输层 2.2 TCP协议 2.2.2 关于可靠传输 4.滑动窗口 前面的三个机制&#xff0c;都是在保证 tcp 的可靠性&#xff1b; TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了)&#xff1b; 滑动窗口,就让可靠传输对性能的影响,更…

CSS 圆形的时钟秒针状的手柄绕中心点旋转的效果

<template><!-- 创建一个装载自定义加载动画的容器 --><view class="cloader"><!-- 定义加载动画主体部分 --><view class="clface"><!-- 定义类似秒针形状的小圆盘 --><view class="clsface"><!-…