当前位置: 首页 > news >正文

Linux软件编程笔记三——标准IO(二进制)文件IO

文章目录

  • 一、标准IO接口
  • 二、流的定位
  • 三、文件IO
    • 1.概念
    • 2.系统调用与库函数
    • 3.文件IO函数接口
      • 1.函数接口
      • 2.文件打开
      • 3.关闭文件描述符
  • 四、练习


一、标准IO接口

  • fwrite:
原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:向流中写入ptr指向的nmemb个对象,每个对象size个字节
参数:ptr:指向数据空间的首地址size:写入的每个对象的大小nmemb:写入对象的个数stream:文件流指针
返回值:成功返回实际写入对象的个数失败返回0
  • fread:
原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从流中读取nmemb个对象到ptr指向的空间中,每个对象size个字节
参数:ptr:存放数据空间的首地址size:读取对象的字节大小memb:读取对象的个数stream:文件流指针
返回值:成功返回读到对象的个数失败或者读到文件末尾返回0
  • 利用fread和fwrite实现一个图片的拷贝:
#include <stdio.h>int main(void)
{FILE *fsrc = NULL;FILE *fdst = NULL;char tmpbuff[4096] = {0};size_t nret = 0;fsrc = fopen("src.jpg", "r");if (NULL == fsrc){perror("fail to fopen");return -1;}fdst = fopen("dst.jpg", "w");if (NULL == fdst){perror("fail to fopen");return -1;}while (1){nret = fread(tmpbuff, 1, sizeof(tmpbuff), fsrc);//保障能读完if (0 == nret){break;}fwrite(tmpbuff, 1, nret, fdst);//读多少写多少}fclose(fsrc);fclose(fdst);return 0;
}

二、流的定位

  • 概念:设置流的偏移量
  • fseek:
原型:int fseek(FILE *stream, long offset, int whence);
功能:设置流的偏移量的标识
参数:stream:文件流指针offset:偏移量> 0 向后偏移< 0 向前偏移whence:标识SEEK_SET 文件开头SEEK_CUR 当前位置SEEK_END 文件末尾
返回值:成功返回0 失败返回-1
  • ftell:
原型:long ftell(FILE *stream);
功能:获得流的偏移量
参数:stream:文件流指针
返回值:成功返回流的偏移量
  • rewind:
原型:void rewind(FILE *stream);
功能:将流重新定位到开头
#include <stdio.h>int main(void)
{FILE *fp = NULL;long len = 0;fp = fopen("a.txt", "w");if (NULL == fp){perror("fail to fopen");return -1;}fseek(fp, 10, SEEK_SET);fputc('a', fp);len = ftell(fp);printf("len = %ld\n", len);fseek(fp, -5, SEEK_CUR);fputc('b', fp);len = ftell(fp);printf("len = %ld\n", len);fseek(fp, 0, SEEK_END);fputc('c', fp);len = ftell(fp);printf("len = %ld\n", len);rewind(fp);
//    fseek(fp, 0, SEEK_SET);fputc('d', fp);len = ftell(fp);printf("len = %ld\n", len);fclose(fp);return 0;
}

三、文件IO

1.概念

  • 标准IO是有缓存的IO,文件IO没有缓存,适合于通信、硬件设备操作
  • 标准IO是库函数,文件IO是系统调用

2.系统调用与库函数

  • 系统调用:是Linux内核中的代码,只能在Linux系统中使用
  • 库函数:是对系统调用的封装,可以在不同的操作系统中安装并使用,库函数最终还是要调用系统调用完成对应功能
    在这里插入图片描述

3.文件IO函数接口

1.函数接口

标准IO				文件IO
fopen				open
fclose				close
fgetc/fputc			read/write
fgets/fputs
fscanf/fprintf
fread/fwrite
fseek/ftell/rewind  lseek

2.文件打开

  • 注意:
    • 有三个特殊的文件描述符:标准输入(0)、标准输出(1)、标准错误(2)
    • 文件描述符特点:
      • 非负整数
      • 取尚未被占用的最小的非负整数
      • 文件描述符是有上限的,到达上限后再打开会报错误
原型:int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);
功能:打开文件获得操作文件的文件描述符
参数:pathname:要打开的文件路径flags:打开文件的标志,必须包含三者之一O_RDONLYO_WRONLYO_RDWRO_CREAT		文件不存在创建(注意要给定创建文件的权限)O_TRUNC		文件存在截断为0(清0)O_APPEND	追加O_EXCL		文件存在报错
返回值:成功返回新文件描述符失败返回-1
  • 请写出标准IO对应的文件IO的打开方式
    在这里插入图片描述

3.关闭文件描述符

原型:int close(int fd);
功能:关闭文件描述符

四、练习

  • 统计一个文件中出现最多的字符是哪个?出现了多少次?

方式一:参考链表

/* head.h文件 */
#ifndef _HEAD_H_
#define _HEAD_H_#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include <math.h>#define m_fgets(filename) do{ \fgets(filename,sizeof(filename),stdin); \filename[strlen(filename) - 1] = '\0'; \
}while(0)#endif 
#include "../head.h"
#include "cirlist.h"int find_max_char(char *filename, int *pmaxchar, int *pmaxcnt)
{FILE *fp = NULL;linknode *pcirlist = NULL;linknode *ptmpnode = NULL;char ch = 0;pcirlist = create_empty_linklist();fp = fopen(filename, "r");if (NULL == fp){perror("fail to fopen");return -1;}while (1){ch = fgetc(fp);if (EOF == ch){break;}/* 如果第一次出现则新增该节点 */ptmpnode = find_linklist(pcirlist, ch);if (NULL == ptmpnode){insert_tail_linklist(pcirlist, ch);}/* 从链表中找到节点,计数器自加 */ptmpnode = find_linklist(pcirlist, ch);ptmpnode->cnt++;	//在节点类型中添加 int cnt; 表示字符出现的次数}fclose(fp);ptmpnode = find_max_node(pcirlist);if (ptmpnode != NULL){*pmaxchar = ptmpnode->data;*pmaxcnt = ptmpnode->cnt;}destroy_linklist(&pcirlist);return 0;
}   int main(void)
{char filename[256] = {0};int maxcnt = 0;int maxchar = 0;int ret = 0;printf("请输入要检测的文件名:\n");m_fgets(filename);ret = find_max_char(filename, &maxchar, &maxcnt);if (ret != 0){printf("fild max char failed\n");return -1;}printf("出现最多的字符:%c, 次数:%d\n", maxchar, maxcnt);return 0;
}
/* 在cirlist.c中添加 */
linknode *find_max_node(linknode *phead)
{linknode *ptmpnode = NULL;linknode *pmaxnode = NULL;if (phead == phead->pnext){return NULL;}pmaxnode = phead->pnext;ptmpnode = phead->pnext->pnext;while (ptmpnode != phead){if (ptmpnode->cnt > pmaxnode->cnt){pmaxnode = ptmpnode;}ptmpnode = ptmpnode->pnext;}return pmaxnode;
}
/* 方式二:数组 */
int find_max_char(char *filename, int *pmaxchar, int *pmaxcnt)
{FILE *fp = NULL;int cnt[256] = {0};char ch = 0;int max;int i = 0;fp = fopen(filename, "r");if (NULL == fp){perror("fail to fopen");return -1;}while (1){ch = fgetc(fp);if (EOF == ch){break;}cnt[ch]++;}fclose(fp);max = 0;for (i = 1; i < 256; i++){if (cnt[i] > cnt[max]){max = i;}}*pmaxchar = max;*pmaxcnt = cnt[max];return 0;
}
http://www.dtcms.com/a/540147.html

相关文章:

  • 如何使用 TinyEditor 快速部署一个协同编辑器
  • pgsql常用函数
  • 企业落地 NL2SQL,需要的是 AI-ready data 和小模型
  • 最好的购物网站排名厦门的推广公司有哪些
  • PyTorch2 Python深度学习 - 初识PyTorch2,实现一个简单的线性神经网络
  • 外贸网站建设gif制作软件app
  • 我回来了,依然关注新能源汽车研发测试,
  • Go 语言数组
  • Go语言-->sync.WaitGroup 详细解释
  • 从“造机器”到“造生态”:中国智能时代的系统跃迁——从宇树实训平台到视频神经系统的启示
  • YOLOV5_TensorRT_C++部署
  • 海南省住房和城乡建设官方网站网站域名不备案
  • 网络空间引擎
  • VANCHIP射频芯片:智能汽车的“第六感”觉醒
  • C++——二叉搜索树——数据结构进阶——附加超详细解析过程/代码实现
  • 网站页面两侧漂浮的怎样做电商网站前端页面内容编写
  • PCIE学习
  • API Key 管理与计费系统模块(API Gateway 模块)需求文档
  • 2024-2025年技术发展趋势深度分析:AI、前端与后端开发的革新之路
  • vue3 实现贪吃蛇 电脑版01
  • 做网站带后台多少钱东莞做网站 动点官网
  • 郑州做网站建设wordpress数据控查看密码
  • 数据采集-BeautifulSoup库
  • 帝国cms的阅读量增加的api接口示例
  • RDF 实例
  • 面向对象编程:继承从理论到实战
  • 43-基于STM32的医用护理床设计与实现
  • 【经济方向专题会议】第二届经济数据分析与人工智能国际学术会议 (EDAI 2025)
  • Auto CAD二次开发——折线多段线
  • django做的购物网站海口网站建设优化案例