我要成为嵌入式高手之2月4、5日Linux高编第二天!!

读写函数接口

1、fgetc

        语法:

        功能:从流中获取一个字符

练习1:编写程序统计文件的行数

#include <stdio.h>

int main(void)
{
    FILE *fp = NULL;
    char ch = 0;
    int row = 0;
    
    fp = fopen("file.txt","r");
    if (NULL == fp)
    {
        perror("file to fopen!");
        return -1;
    }

    while(1)
    {
        ch = fgetc(fp);
        if (EOF == ch)
        {
            break;
        }
        if (ch == '\n')
        {
            ++row;
        }
    }

    printf("row = %d\n",row);

    return 0;
}

2、fgetc/fputc 与 getchar( ) / putchar( )的区别

        fgetc 和 fputc 操作ASCII码文件单个字符

        char ch = 0;

        ch = getchar( ); ==  ch = fgetc(stdin);   // 等价关系

        ch = putchar( ): ==  ch = fputc(stdout); // 等价关系

     练习2:将源文件的内容写到目的文件中

#include <stdio.h>

int main(void)
{
    FILE *fp1 = NULL;
    FILE *fp2 = NULL;
    char ch = 0;

    fp1 = fopen("dest.txt","w");
    fp2 = fopen("src.txt","r");

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

    while (1)
    {
        ch = fgetc(fp2);
        if (EOF == ch)
        {
            break;
        }

        fputc(ch,fp1);
    }

    fclose(fp1);
    fclose(fp2);

    return 0;
}

3、fputs 

 int fputs(const char *s, FILE *stream); // stream文件流指针

功能:把字符串写入流中,不会写字符串的 ' \0 '

返回值:成功返回非负数、失败返回EOF

例:

#include <stdio.h>

int main(void)
{
    char s[32] = "hello";
    FILE *fp = NULL;

    fp = fopen("fputs.txt","w");
    if (fp == NULL)
    {
        perror("fail to fopen");
        return -1;
    }

    fputs(s,fp);

    fclose(fp);

    return 0;
}

4、fgets

        char *fgets(char *s, int size, FILE *stream);

        功能:从流中读取一个字符串(最多读4095个—要保留一位给\0)

        参数:s—存放字符串空间首地址;size—最多读取个数;stream—文件流指针

        返回值:成功返回存放字符串空间的首地址;失败返回NULL;读到文件末尾也会返回NULL

5、fputs/ fgets与gets / puts 的区别

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

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

        2)gets会去掉从终端接收的/n,换成/0

             fgets则会保留并在末尾加上/0

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

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

6、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 Stu
{
    char name[32];
    char sex;
    int age;
    int score;
}stu;

int main(void)
{
    stu a = {"zhangsan",'m',19,100};
    stu s[3] = {{"aa",'m',18,90},{"bb",'f',18,90},{"cc",'f',20.99}};

    FILE *fp = NULL;
    fp = fopen("fwrite.txt","w");
    if (NULL == fp)
    {
        perror("fail to fopen!");
        return -1;
    }

    fwrite(&a,sizeof(stu),1,fp);
    fwrite(s,sizeof(stu),3,fp);

    fclose(fp);

    return 0;
}

7、fread(二进制)

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

        功能:从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中

        参数:ptr:要读的内容所在的空间的首地址

                   size:读的内容每个数据的大小

                   nmemb:数据的个数

                   stream:文件流指针

        返回值:成功返回读到对象的个数,失败返回0,读到文件末尾返回0

练习3:利用fread和fwrite完成将src.jpg图片内容拷贝到dst.jpg图片中

#include<stdio.h>

int main(void)
{
    FILE *fp1 = NULL;
    FILE *fp2 = NULL;
    size_t ret
    char s[4096] = {0};

    fp1 = fopen("des.jpg","w");
    fp2 = fopen("src.jpg","r");

    if (fp1 == NULL || fp2 == NULL)
    {
        perror("fail to fopen!");
        return -1;
    }
    
    while(1)
    {
        ret = fread(s, 1, sizeof(s), fp2);//每次读一个字节,读s大小次
        printf("ret = %ld\n",ret);
        if (ret == 0)
        {
            break;
        }
        fwrite(s, 1, ret, fp1);//每次写一个字节,写ret次—可以保证最后一次写的也是读的数据个数
    }

    fclose(fp1);
    fclose(fp2);
    
    return 0;
}

8、fscanf

int fscanf(FILE *stream, const char *format, ...);

功能:从流中读取格式化的字符串(读不了带空格的字符串)

9、fprintf

int fprintf(FILE *stream, const char *format, ...);

功能:将格式化字符串输入到指定流中

#include<stdio.h>

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

    fp = fopen("file.txt","w");
    if (fp == NULL)
    {
        perror("fail to fopen!");
        return -1;
    }
    fprintf(fp,"hello world\nNum1 = %d\nNum2 = %d\n",Num1,Num2);
    fclose(fp);

    return 0;
}

流的定位

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("fail to fopen");
        return -1;
    }

    fseek(fp, 10, SEEK_SET);
    fputc('a',fp);

    fseek(fp, -5, SEEK_CUR);
    fputc('a',fp);

    fseek(fp, 1, SEEK_SET);
    fputc('a',fp);

    fclose(fp);

    return 0;
}

练习4:编写一个程序实现统计一个文件的大小

#include <stdio.h>

int main(void)
{
    FILE *fp = NULL;

    fp = fopen("file.txt","r");

    if (fp == NULL)
    {
        perror("fail to fopen");
        return -1;
    }
    
    fseek(fp, 0, SEEK_END);
    long len = ftell(fp);

    printf("len = %ld\n",len);

    return 0;
}

练习5:读取bmp图片类型的宽度和高度

注:图片的宽度和高度在图片的信息里

typedef struct tagBITMAPFILEHEADER { // bmfh 
    WORD    bfType; //占2字节
    DWORD   bfSize; //占4字节
    WORD    bfReserved1; //占2字节
    WORD    bfReserved2; //占2字节
    DWORD   bfOffBits; //占4字节
} BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER{ // bmih 
    DWORD  biSize; 
    LONG   biWidth; //4字节
    LONG   biHeight; 
    WORD   biPlanes; 
    WORD   biBitCount 
    DWORD  biCompression; 
    DWORD  biSizeImage; 
    LONG   biXPelsPerMeter; 
    LONG   biYPelsPerMeter; 
    DWORD  biClrUsed; 
    DWORD  biClrImportant; 
} BITMAPINFOHEADER; 

 

#include <stdio.h>

int main(void)
{
    FILE *fp = NULL;
    fp = fopen("src.bmp","r");
    int width = 0;
    int height = 0;

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

    fseek(fp,18,SEEK_SET);
    fread(&width,sizeof(width),1,fp);
    fread(&height,sizeof(height),1,fp);
    fclose(fp);
    
    printf("width = %d\n",width);
    printf("height = %d\n",height);

    return 0;
}

 练习6:从终端输入一个单词,获得单词的含义

注:dict.txt文件为英文词典文件,如:

        abbess           n. woman who is head of a convent or nunnery

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

int main(void)
{
    char s[32];
    char tmpbuff[4094];
    char *ptmp = NULL;

    printf("Input a word to search: ");
    putchar('\n');
    gets(s);

    FILE *fp = NULL;
    fp = fopen("dict.txt","r");
    if (fp == NULL)
    {
        perror("fail to fopen");
        return -1;
    }

    while (1)
    {
        char *pret = NULL;

        pret = fgets(tmpbuff, sizeof(tmpbuff), fp);//读取文件一行

        if (pret != NULL)
        {
            ptmp = tmpbuff;
            while (*ptmp != ' ' && *ptmp != '\0')
            {
                ++ptmp;
            }
            *ptmp = '\0';
            ++ptmp;

            while (*ptmp == ' ')
            {
                ++ptmp;
            }//将一行进行解析,解析为单词和含义两部分
        }else
        {
            printf("No word!\n");
            fclose(fp);
            return -1;
        }

        if (strcmp(s,tmpbuff) == 0)
        {
            printf("   Word: %s\n",s);
            printf("Tmpbuff: %s\n",tmpbuff);
            printf("Meaning: %s\n",ptmp);
            break;
        }
    }
    fclose(fp);

    return 0;
}

标准IO重点总结:

文件内容拷贝

        fgetc / fputc

        fgets / fputs

        fread / fwrite

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

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

相关文章

5 分钟让你了解什么是搜索引擎

文章目录 搜索引擎概述基于业务模式分类垂直搜索&#xff08;垂搜&#xff09;通用搜索&#xff08;通搜&#xff09;本地搜索引擎 基于技术实现分类基于关键词的搜索引擎&#xff08;Keyword-based Search Engine&#xff09;语义搜索引擎&#xff08;Semantic Search Engine&…

好用的大学生教材搜题软件?帮助大学生解决问题的实用搜题工具 #知识分享#知识分享#经验分享

对于大学生来说&#xff0c;每天面对各式各样的学习任务和问题&#xff0c;寻找合适的学习资源和工具成了我们的迫切需求。幸运的是&#xff0c;现如今有许多高效且实用的日常搜题和学习软件可以满足我们的需求&#xff0c;助力我们取得更好的学习成果。 1.Forest专注森林 Fo…

力扣:42. 接雨水 84.柱状图中最大的矩形(单调栈,双指针)

这两道题解题思路类似&#xff0c;一个是单调递增栈&#xff0c;一个是单调递减栈。本篇博客给出暴力&#xff0c;双指针和单调栈解法。 42. 接雨水 题目&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后…

CIFS(Samba)服务的使用

理论部分 概念&#xff1a; 通用互联网文件系统CIFS使用的是公共的或者开放的SMB协议版本。SMB是在会话层和表示层以及小部分应用层上的 协议&#xff0c;使用了NetBIOS的应用程序接口API。该协议在局域网上用于服务器文件访问和打印。它使用客户/服务器模式&#xff0c;客 户…

ffmpeg的使用,安装,抽帧,加水印,截图,生成gif,格式转换,抓屏等

实际使用中总结的关于ffmpeg对视频的处理的记录文档 具体信息&#xff1a; http://ffmpeg.org/download.html 官网下载ffmpeg 关于ffmpeg的安装详细步骤和说明 装ffmpeg 方式,Linux和windows下的 http://bbs.csdn.net/topics/390519382 php 调用ffmpeg , http://bbs.csdn.net/t…

【算法】利用递归dfs解决二叉树算法题(C++)

文章目录 1. 前言2. 算法题2331.计算布尔二叉树的值129.求根节点到叶节点数字之和LCR047.二叉树剪枝98.验证二叉搜索树230.二叉搜索树中第K小的元素257.二叉树的所有路径 1. 前言 有关 递归 的相关解释与解题 请看下文&#xff1a; 以汉诺塔理解递归、并用递归解决算法题 对于…

关于Linux和消息队列常见的十道面试题

实际工作中如何排查CPU飙升问题&#xff1f; 在实际工作中&#xff0c;我们可以通过以下步骤来排查CPU飙升的问题&#xff1a; 使用系统监控工具&#xff1a;首先&#xff0c;我们可以使用系统监控工具&#xff0c;如top命令&#xff0c;来查看所有进程占系统CPU的排序。这样可…

AI助力农作物自动采摘,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建作物生产场景下番茄采摘检测计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…

【深度学习】从0完整讲透深度学习第2篇:TensorFlow介绍和基本操作(代码文档已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归&#xff08;含代码&#xff09;&#xff0c;熟练掌握numpy,pandas,sklearn等框架使用。在算法上&#xff0c;掌握神经网络的数学原理&#xff0c;手动实…

2024数学建模美赛F题Reducing Illegal Wildlife Trade原创论文讲解(含完整python代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了数学建模美赛本次F题目非法野生动物贸易完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 F题论文共42页&…

MySQL温故篇(一)SQL语句基础

一、SQL语句基础 1、SQL语言分类 DDL&#xff1a;数据定义语言 DCL&#xff1a;数据控制语言 DML&#xff1a;数据操作语言 DQL&#xff1a;数据的查询语言 2、数据类型 3、字符类型 char(11) &#xff1a; 定长 的字符串类型,在存储字符串时&#xff0c;最大字符长度11个&a…

PiflowX新增Apache Beam引擎支持

参考资料&#xff1a; Apache Beam 架构原理及应用实践-腾讯云开发者社区-腾讯云 (tencent.com) 在之前的文章中有介绍过&#xff0c;PiflowX是支持spark和flink计算引擎&#xff0c;其架构图如下所示&#xff1a; 在piflow高度抽象的流水线组件的支持下&#xff0c;我们可以…

【C/C++】C/C++编程——整型(二)

在 C 中&#xff0c;整型数据可以分为有符号数&#xff08;Signed&#xff09;和无符号数&#xff08;Unsigned&#xff09;&#xff0c;这两种类型主要用于表示整数值&#xff0c;但它们在表示范围和用途方面有所不同。默认情况下&#xff0c;整数类型如 int、short、long 都是…

爱上JUC: 面试常考题大总结(线程安全篇)

&#x1f31f;一起备战面试吧&#x1f604;&#xff0c;也是巩固&#x1f4aa;&#xff0c;不再害怕面试&#x1f44a; 文章目录 进程和线程区别并行和并发的区别创建线程的方式有哪些runnable和callable有什么区别run和start区别线程包含哪些状态&#xff0c;是如何转换的&…

【TCP/IP】用户访问一个购物网站时TCP/IP五层参考模型中每一层的功能

当用户访问一个购物网站时&#xff0c;网络上的每一层都会涉及不同的协议&#xff0c;具体网络模型如下图所示。 以下是每个网络层及其相关的协议示例&#xff1a; 物理层&#xff1a;负责将比特流传输到物理媒介上&#xff0c;例如电缆或无线信号。所以在物理层&#xff0c;可…

DockerUI如何部署结合内网穿透实现公网环境管理本地docker容器

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

基于协同算法的图书信息管理系统(编号V73)

Java精品项目源码基于协同算法的图书信息管理系统(编号V73) 大家好&#xff0c;小辰今天给大家介绍一个图书信息管理系统&#xff0c;演示视频公众号&#xff08;小辰哥的Java&#xff09;对号查询观看即可 文章目录 Java精品项目源码基于协同算法的图书信息管理系统(编号V73…

Pandas.Series.cumsum() 累积和 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

医学答案怎么查找?3个受欢迎的搜题分享了 #其他#职场发展#职场发展

学习工具是我们的得力助手&#xff0c;帮助我们更好地组织学习内容和时间。 1.南北题库 这是一个网站 完全免费,主要的特点就是题库全面丰富,涵盖计算机、外语、论文撰写、注册会计师等。并且后续还会继续扩展题库,题目分类非常详细,体界面清晰简洁。 有举一反三功能,搜一道…

使用PHPStudy搭建本地web网站并实现任意浏览器公网访问

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…