Day 3. Linux高级编程之函数接口和流的定位

gets和fgets区别

1)gets没有给定最多读取字符的个数,有越界风险\n\n      

  fgets需要给定最多读取的字符个数,没有越界的风险\n\n

2)gets会去掉从终端接收的/n,换成/0\n\n fgets则会保留并在末尾加上/0\n\n

3)puts会在字符串末尾多打印一个/n字符\n\n      

  fputs不会在末尾多打印/n字符

函数接口:

1.fwrite

      size_t fwrite(const 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
{char name[32];char sex;int age;int score;
}stu_t;int main (void)
{stu_t a = {"zhangsan",'m',18,167};stu_t s[3]={{"lisi",'f',17,155},{"wamngliu",'m',18,167},{"jiuqi",'m',17,163},};FILE *fp = NULL;fp = fopen("file.txt","w");if (fp == NULL){perror("file to fopen");return -1;}fwrite(&a,sizeof(stu_t),1,fp);fwrite(s,sizeof(stu_t),3,fp);fclose(fp);return 0;
}

2.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
{char name[32];char sex;int age;int score;
}stu_t;int ShowStuInfo(stu_t tmpstu)
{printf("姓名:%s\n",tmpstu.name);printf("性别:%c\n",tmpstu.sex);printf("年龄:%d\n",tmpstu.age);printf("成绩:%d\n",tmpstu.score);return 0;
}int main (void)
{FILE *fp = NULL;stu_t s[5];size_t ret;int i = 0;stu_t a;fp = fopen("file.txt","r");if (fp == NULL){perror("file to fopen");return -1;}fread(&a,sizeof(stu_t),1,fp);ShowStuInfo(a);ret = fread(s,sizeof(stu_t),5,fp);for (i = 0;i < ret;++i){ShowStuInfo(s[i]);}printf("ret = %ld\n",ret);fclose(fp);return 0;
}

练习:

 利用fread和fwrite完成将src.jpg图片内容拷贝到dst.jpg图片中 char tmpbuff[4096];

#include <stdio.h>int main(void)
{FILE *fp = NULL;FILE *fq = NULL;char s[4096];size_t ret = 0;fp = fopen("src.jpg","r");fq = fopen("dst.jpg","w");if (fp == NULL){perror("file to fopen");return -1;}if (fq == NULL){perror("file to fopen");return -1;}while(1){ret = fread(s,1,sizeof(s),fp);if (ret == 0){break;}fwrite(s,1,ret,fq);}fclose(fp);fclose(fq);return 0;
}

3.fprintf

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

        printf
        fprintf(stdout, );

练习:

#include <stdio.h>int main (void)
{FILE *fp = NULL;int num1 = 100;int num2 = 200;fp = fopen("file.txt","w");if(fp == NULL){perror("file to fopen");return -1;}fprintf(fp,"hello world! num1 = %d num2 = %d\n",num1,num2);fclose(fp);return 0;
}

4.fscanf

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

流的定位

  1.ftell

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

   2.rewind

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

  3.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 *fp = NULL;fp = fopen("file.txt","w");if (fp == NULL){perror("file to fopen");return -1;}fseek(fp,10,SEEK_SET);fprintf(fp,"hello");fseek(fp,-5,SEEK_CUR);fprintf(fp,"app");fseek(fp,6,SEEK_END);fprintf(fp,"world");fclose(fp);return 0;
}

    练习:

编写一个程序实现统计一个文件的大小

#include <stdio.h>int main (void)
{FILE *fp = NULL;int len = 0;fp = fopen("file.txt","r");if (fp == NULL){perror("file to fopen");return -1;}fseek(fp,0,SEEK_END);len = ftell(fp);printf("len = %d\n",len);fclose(fp);return 0;
}

作业:

从终端输入一个单词,获得单词的含义  含义在文件dict.txt中

int main (void)
{char s[30];              //定义一个数组接收需要查找的单词char timp[4096];          //定义一个数组接收一行字符串char *ptmp = NULL;            char *pret = NULL;          printf("Enter a word: \n");gets(s);                            //输入要查找的单词FILE *fp = NULL;fp = fopen("dict.txt","r");          //打开并读取这个文件if (fp == NULL){perror("file to fopen");return -1;}while(1){pret = fgets(timp,sizeof(timp),fp);      //进入循环并用pret接收这一行字符串的地址if (pret == NULL)                           {                             //若pret为空说明最后一行都读完了break;}ptmp = timp;                                   //定义一个指针指向接收的一行字符串的开头while (*ptmp != ' ' && *ptmp != '\0')    {ptmp++;                        //进入循环 如果指针没有指向了空格和'\0',就继续向后移动 遇到空格或‘0’就跳出}*ptmp = '\0';             //在遇到空格的位置补'\0'ptmp++;                //指针在继续往后移动一位while (*ptmp != ' ')       //进入循环 如果指针没有指向了空格{ptmp++;            //继续往后移动 直到跳出 并分成了单词和后面注释这两部分  此时ptmp就为注释的这个字符串的首地址}if (strcmp(s,timp) == 0)           //比较这两个单词 如果相等{printf("ptmp:%s\n",ptmp);     //打印出后面的注释fclose(fp);  return 0;   //关闭流  退出}}printf("%s不存在!\n",s);    fclose(fp);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣热门100题 - 5.最长回文子串

力扣热门100题 - 5.最长回文子串 题目描述&#xff1a;示例&#xff1a;提示&#xff1a;解题思路&#xff1a;&#xff08;动态规划&#xff09;代码&#xff1a; 题目链接&#xff1a;5. 最长回文子串 题目描述&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回…

补题:leetcode第382场周赛 3022. 给定操作次数内使剩余元素的或值最小

3022. 给定操作次数内使剩余元素的或值最小 - 力扣&#xff08;LeetCode&#xff09; 拆位 n个数进行或运算的结果最小&#xff0c;每次操作可以对相邻的两个数进行与运算&#xff0c;至多进行k次操作 n个数进行或运算&#xff0c;可以对每个数进行拆解&#xff0c;拆解成最小…

vue3 mathjax 数学公式

安装 pnpm install mathjax 新建文件/util/mathjax.js window.MathJax {tex: {inlineMath: [["$", "$"],["\\(", "\\)"],], // 行内公式选择符displayMath: [["$$", "$$"],["\\[", "\\]"…

Linux的进程信号

注意&#xff1a;首先需要提醒一个事情&#xff0c;本节提及的进程信号和下节的信号量没有任何关系&#xff0c;请您区分对待。 1.信号概念 1.1.生活中的信号 我们在生活中通过体验现实&#xff0c;记忆了一些信号和对应的处理动作&#xff0c;这意味着信号有以下相关的特点&…

idea开发工具的简单使用与常见问题

1、配置git 选择左上角目录file->setting 打开&#xff0c;Version Control 目录下Git&#xff0c;选择git安装目录下的git.exe文件&#xff1b; 点击test&#xff0c;出现git版本&#xff0c;则表示git识别成功&#xff0c;点击右下角确认即可生效。 2、配置node.js 选…

nginx upstream server主动健康检测模块ngx_http_upstream_check_module 使用和源码分析(中)

目录 6. 源码分析6.1 解析指令分析6.2 待检查的服务器的添加和状态查询6.3 本模块的进程初始化函数6.4 准备执行健康检测任务6.5 执行健康检测任务本篇对ngx_http_upstream_check_module的源码实现进行详细分析。 关于配置和使用部分可以查看上篇:nginx upstream server主动健…

table列折行

这里折叠后少了合同名称,风险进展,预判无法达成金额 通过按钮的状态,来控制某一列的显示与隐藏, <el-tablev-loading"loading"v-if"tableStatus"border:data"tableData":key"tableKey"id"table"class"table-self is…

【MATLAB】使用梯度提升树在回归预测任务中进行特征选择(深度学习的数据集处理)

1.梯度提升树在神经网络的应用 使用梯度提升树进行特征选择的好处在于可以得到特征的重要性分数&#xff0c;从而识别出对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力&#xff0c;减少过拟合的风险&#xff0c;并且可以加快模型训练和推理速度。此外&…

C#,河豚算法(Blowfish Algorithm)的加密、解密源代码

Bruce Schneier 1 河豚算法&#xff08;Blowfish Algorithm&#xff09; 河豚算法&#xff08;Blowfish Algorithm&#xff09;是1993年11月由Bruce Schneier设计的一个完全开源的算法。 Blowfish算法是一个分组长度为64位、密钥长度可变的对称分组密码算法。 Blowfish算法具…

docker复习笔记01(小滴课堂)安装+部署mysql

查看内核版本。 关闭防火墙&#xff1a; 查看docker版本&#xff1a; 下载阿里yum源&#xff1a; 再看一下yum版本都有哪些&#xff1a; 我们可以看的docker-ce了。 安装它&#xff1a; 设置docker服务开机启动&#xff1a; 更新日志文件&#xff1a; 启动docker&#xff1a; …

【云原生之kubernetes系列】--HPA自动伸缩

HPA自动伸缩 HorizontalPodAutoscaler&#xff08;简称 HPA &#xff09;自动更新工作负载资源&#xff08;例如Deployment或者Statefulset)&#xff0c;目的是让pod可以自动扩缩工作负载以满足业务需求。 水平扩缩意味着对增加的负载的响应是部署更多的Pod。这与“垂直&…

【零基础入门TypeScript】Union

目录 语法&#xff1a;Union文字 示例&#xff1a;Union类型变量 示例&#xff1a;Union 类型和函数参数 Union类型和数组 示例&#xff1a;Union类型和数组 TypeScript 1.4 使程序能够组合一种或两种类型。Union类型是表达可以是多种类型之一的值的强大方法。使用管道符号…