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

news2024/11/24 12:45:56

读写函数接口

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

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

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

相关文章

C#验证字符串的长度,用正则表达式 vs 字符数组长度或字符串的长度

目录 一、使用的方法 1.使用正则表达式 2.通过计算字符串的长度验证 二、实例 1.源码 2.生成效果 一、使用的方法 1.使用正则表达式 使用正则表达式可以判断和限制用户输入的字符串长度。 比如验证用户密码不得少于8为&#xff0c;匹配的正则表达式"^.{8,}$"…

ShardingSphere 5.x 系列【5】Spring Boot 3 集成并实现读写分离

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 使用限制3. 案例演示3.…

空气质量预测 | Matlab实现基于SVR支持向量机回归的空气质量预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 政府机构使用空气质量指数 (AQI) 向公众传达当前空气污染程度或预测空气污染程度。 随着 AQI 的上升,公共卫生风险也会增加。 不同国家有自己的空气质量指数,对应不同国家的空气质量标准。 基于支持向量机(Su…

高速接口PCB布局指南(一)高速信号接口概述

高速接口PCB布局指南&#xff08;一&#xff09;高速信号接口概述 1.什么是高速信号接口&#xff1f;2.高速信号PCB设计概述2.1 概述2.2 关键信号 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.什么是高速信号接口&#xff1f; 高速信号接口是指用于传输高…

jmeter-04创建请求

文章目录 一、发送请求-查看响应流程二、新建请求三、选择请求方式&#xff0c;填写url1.发送get请求当只有请求方式不一样的时候&#xff0c;参数都填写在参数栏里面&#xff0c;GET请求与POST请求的区别&#xff1f; 2.发送post请求2.1 application/x-www-form-urlencoded2.2…

二叉搜索树题目:二叉搜索树的最近公共祖先

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉搜索树的最近公共祖先 出处&#xff1a;235. 二叉搜索树的最近公共祖先 难度 3 级 题目描述 要求 给定一个…

Springboot集成ElasticSearch快速入门demo

一、ElasticSearch介绍 elasticsearch是构建在Apache Lucene上的使用Java语言开发的开源分布式搜素引擎。Lucene是一个开源的全文搜索引擎工具包&#xff0c;它仅是一个工具包而不是一个完整的工作引擎&#xff0c;并且只能被Java应用程序调用&#xff0c;elasticsearch基于RES…

云计算运营模式介绍

目录 一、云计算运营模式概述 1.1 概述 二、云计算服务角色 2.1 角色划分 2.1.1 云服务提供商 2.1.2 云服务消费者 2.1.3 云服务代理商 2.1.4 云计算审计员 2.1.5 云服务承运商 三、云计算责任模型 3.1 云计算服务模式与责任关系图 3.2 云计算服务模式与责任关系解析…

C++进阶--搜索二叉树

概念 搜索二叉树是一种特殊的二叉树&#xff0c;其具有以下特点&#xff1a; 1.对于每个结点&#xff0c;它的左子树中的所有节点的值都小于该节点的值&#xff0c;而右子树中的所有节点的值都大于该节点的值。 2.左子树和右子树都是搜索二叉树。 这个 特性使得搜索二叉树可…

计算机网络原理基础

目录 前言&#xff1a; 1.网络发展史 2.网络通信基础 2.1IP地址 2.1.1定义 2.1.2格式 2.2端口号 2.2.1定义 2.2.2格式 2.3协议 2.3.1定义 2.3.2作用 2.3.3分层 2.4五元组 2.4.1定义 2.4.2组成 3.TCP/IP五层网络模型 3.1模型概念 3.2模型构成 3.3网络分层对应…

06-Java适配器模式 ( Adapter Pattern )

原型模式 摘要实现范例 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁 适配器模式涉及到一个单一的类&#xff0c;该类负责加入独立的或不兼容的接口功能 举个真实的例子&#xff0c;读卡器是作为内存卡和笔记本之间的适配器。您将内…

机器学习逻辑回归模型训练与超参数调优 ##3

文章目录 [TOC]基于Kaggle电信用户流失案例数据&#xff08;可在官网进行下载&#xff09;逻辑回归模型训练逻辑回归的超参数调优 基于Kaggle电信用户流失案例数据&#xff08;可在官网进行下载&#xff09; 数据预处理部分可见&#xff1a; 机器学习数据预处理方法&#xff0…

layui

基于复杂结构的自定义模版相关介绍 我这里的接口给的格式数据 我这里搜索往返时候要显示成这样的 layui.use([table,form], function(){ var table layui.table; var form layui.form;// 渲染表格 table.render({ elem: #test-table-reload,toolbar: #toolbarDemo, …

【PPT密码】ppt设置的编辑密码,如何取消?

不知道大家是否了解PPT文件的编辑密码&#xff0c;首先ppt中没有限制编辑功能&#xff0c;设置为只读模式后仍然可以编辑文件&#xff0c;但其实有一种类似于限制编辑的加密方式。在我们打开PPT文件的时候会有密码输入框。 如果我们没有输入密码&#xff0c;以只读方式进入&…

每日一题——LeetCode1403.非递增顺序的最小子序列

方法一 个人方法&#xff1a; 按题目要求&#xff0c;尽可能先取出nums里最大的值&#xff0c;这样才能满足子序列尽可能短且元素之和最大 var minSubsequence function(nums) {nums.sort((a,b)>a-b)let sum1nums.reduce((a,b)>ab,0),sum20,res[]while(sum1>sum2){…

libevent源码解析--evbuffer_chain,evbuffer,bufferevent,bufferevent_private

1.概述 前面我们已经分析了event&#xff0c;event_callback&#xff0c;event_base及监听套接字处理。 有了event_base我们便可实现事件监控&#xff0c;事件分发处理。 有了监听套接字处理&#xff0c;我们便可实现服务端监听&#xff0c;通过accept得到服务端通信套接字。 …

Linux---信号

前言 到饭点了&#xff0c;我点了一份外卖&#xff0c;然后又开了一把网游&#xff0c;这个时候&#xff0c;我在打游戏的过程中&#xff0c;我始终记得外卖小哥会随时给我打电话&#xff0c;通知我我去取外卖&#xff0c;这个时候游戏还没有结束。我在打游戏的过程中需要把外…

【Boost】:阶段性测试和阶段性代码合集(五)

阶段性测试和阶段性代码合集 一.编写测试程序-server.cc二.一些问题三.完整源代码 在这里添加了一些打印信息&#xff0c;方便我们观察&#xff0c;由于比较分散就不一一列举&#xff0c;可以看下面的完整源代码。 一.编写测试程序-server.cc 1.原版 只是简单的测试&#xff0…

多输入多输出 | Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络多输入多输出预测

多输入多输出 | Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络…

Java Arrays 的相关操作数组排序

Java Arrays 的相关操作数组排序 package com.zhong.arrays;import java.math.BigDecimal; import java.util.Arrays; import java.util.Comparator;public class ArraysDemo {public static void main(String[] args) {int[] arr {10, 20, 40, 30, 90, 60, 10, 30, 50};// A…