文件IO/标准IO

1.标准I/O

标准: 任何操作系统皆可使用;使用范围很广

系统调用和库函数

系统调用:操作系统给我们提供的接口                     man 2

printf 可以调用内核中的接口  直接驱动显卡运行

printf实际是库函数中的函数,然后调用系统调用

原因:针对不同的操作系统,库函数可以翻译后成标准的系统调用对接不同的系统(安卓/linux)

strlen memcpy 等函数 也是靠库函数实现                 man 3

直接使用系统调用的--->    文件io

  1. 系统调用和库函数

    系统调用就是操作系统提供的接口函数.

如果我们把系统调用封装成库函数就可以起到隔离的作用,提供程序的可移植性。

Printf就是库函数然后调用了系统调用才在显示器上显示字符。

  1. 流的概念   文本流   和   二进制流

就是数据的流,在程序中就是一个结构体。

不同系统,流  不一样

  1. Windows 和linux的换行符区别

   Windows是\r\n

   Linux 是\n

  1. 缓冲区的概念

   为了减少操作IO设备的次数,提高运行效率,在内存里面设置的缓冲区,

   全缓冲:缓冲区满才输出

   行缓冲:遇到换行符输出

2. 文件的打开:

  1. 文件的打开函数

FILE *fopen (const char *path, const char *mode);

Path: 普通文件当前路径不需要加目录,其他要使用完整的路径

Mode:

返回值:出错返回NULL,所以使用fopen函数必须判断是否为空

  1. 文件打开的模式(非常重要)

“r” 或 “rb”

以只读方式打开文件,文件必须存在。

“r+” 或 ”r+b”

以读写方式打开文件,文件必须存在。

“w” 或 “wb”

以只写方式打开文件,若文件存在则文件长度清为0。若文件不存在则创建。

“w+” 或 “w+b”

以读写方式打开文件,其他同”w”。

“a” 或 “ab”

以只写方式打开文件,若文件不存在则创建;向文件写入的数

据被追加到文件末尾。

“a+” 或 “a+b”

以读写方式打开文件。其他同”a”

 文件的打开

#include<stdio.h>int main(int argc, const char *argv[])
{FILE *fp;int ret = 0;fp = fopen("1.txt","a");if (fp == NULL){perror("fopen");return -1;}else{printf("open success\n");ret = fclose(fp);if (ret == 0){printf("fclose success\n");}else{perror("fclose");}}return 0;
}

读写单个字符

字符的输入(读单个字符):

int  fgetc(FILE *stream);

 int  getc(FILE *stream);   //宏

 int  getchar(void);

字符的输出(写单个字符):

int  fputc(int c, FILE *stream);

int  putc(int c, FILE *stream);

int  putchar(int c);

include<stdio.h>int main(int argc, const char *argv[])
{FILE *fp;fp = fopen("1.txt","a");if(fp == NULL){printf("fopen failed\n");return -1;}/*   读函数int rec;rec = fgetc(fp);printf("get char = %c\n",rec);
//文件指针的应用rec = fgetc(fp);printf("get char = %c\n",rec);rec = fgetc(fp);printf("get char = %c\n",rec);rec = fgetc(fp);printf("get char = %c\n",rec);fclose(fp);*/int wrc = 'c';wrc = fputc(wrc,fp);printf("fputc is %c\n",wrc);return 0;
}

按行读取字符 fgets

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

成功时返回s,到文件末尾或出错时返回NULL

遇到’\n’或已输入size-1个字符时返回,总是包含’\0’

注意事项:

fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。

按行输入字符   fputs

int fputs(const char *s,  FILE *stream);

成功时返回非负整数;出错时返回EOF

puts将缓冲区s中的字符串输出到stdout,并追加’\n’

fputs将缓冲区s中的字符串输出到stream,不追加  ‘\n’

#include<stdio.h>
int main(int argc, const char *argv[])
{FILE *fp;char *rec;char buff[100];fp = fopen("1.txt","a+");if (fp == NULL){perror("fopen");return 0;}rec = fgets(buff,6,fp);if (rec== NULL){perror("fgets");return 0;}while(rec != NULL){rec = fgets(buff,6,fp);printf("buff = %s\n",buff);}
//fputs 的使用,输出字符int wrn;wrn = fputs("aaaaa",fp);//在1.txt文件追加一行字符串aaaaaif(wrn == -1)
{perror("fputs");return -1;
}return 0;
}

二进制读写(二进制读写既可以读写二进制文件,又可以读写文本文件)

文本文件和二进制的区别:

存储的格式不同:文本文件只能存储文本。

所有的文件除了文本文件就是二进制文件:比如说音频文件的读写

计算机内码概念:文本符号在计算机内部的编码(计算机内部只能存储数字0101001....,所以所有符号都要编码)

二进制读写函数格式:

size_t fread(void *ptr, size_t size, size_t n, FILE *fp);

void *ptr  读取内容放的位置指针

  size_t size 读取的块大小

size_t n 读取的个数

  FILE *fp  读取的文件指针

size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);

#include<stdio.h>
#include<string.h>
int main(int argc, const char *argv[])
{FILE *fp;size_t ret;struct student{char name[16];int age;char sex[8];};struct student stu;struct student stu2;strcpy(stu.name,"zhangsan");stu.age = 49;strcpy(stu.sex,"male");fp = fopen("1.bin","w");if(fp == NULL){perror("fopen");return 0;}ret = fwrite(&stu,sizeof(stu),1,fp);if (ret == -1){perror("fwrite");return 0;}else{printf("fwrite is success\n");}fclose(fp);//以上为写入二进制内容,下面为读取二进制文件,首先需要刷新文件流指针,这里选择的是先关闭在打开fp = fopen("1.bin","r");if(fp == NULL){perror("fopen");return 0;}ret = fread(&stu2,sizeof(stu),1,fp);if (ret == -1){perror("fread");return 0;}else{printf("fread is success\n");printf("stu2.name = %s, stu2.age = %d, stu2.sex = %s \n",stu2.name,stu2.age,stu2.sex);}fclose(fp);return 0;
}

 3.文件I/O

文件IO的概念:

什么是文件IO,又称系统IO,系统调用

是操作系统提供的API接口函数。

POSIX接口 (了解)

注意:文件IO不提供缓冲机制

文件IO的API

open  close read read

文件描述符概念:

英文:缩写fd(file descriptor)

是0-1023的数字,表示文件。

0, 1, 2 的含义 标准输入,标准输出,错误

 3.1文件I/O的读写实现

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>int main(int argc, const char *argv[])
{int fd;int ret;char buf[32]={"hello world"};char buf2[32] = {0};fd =open("test.txt",O_RDWR| O_APPEND;printf("fd = %d\n",fd);if(fd<0){perror("open");return 0;}ret =  write(fd,buf,strlen(buf));if (ret < 0 ){perror("write");return 0;}printf("buf = %s\n",buf);
//write函数执行结束后,文件流指针处于末尾,所以需要重新打开文件close(fd);fd =open("test.txt",O_RDWR);printf("fd = %d\n",fd);if(fd<0){perror("open");return 0;}ret = read(fd,buf2,32);if(ret < 0){perror("read");return 0;}buf2[31] = '\0';printf("buf2 = %s\n",buf2);return 0;

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

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

相关文章

openkylin系统通过网线连接ubuntukylin系统上网攻略

openkylin系统通过网线连接ubuntukylin系统上网攻略 主机1&#xff1a;x64 amd &#xff0c;系统&#xff1a;ubuntukylin 22.04 &#xff0c;状态&#xff1a;通过wifi连接热点进行上网&#xff0c;并共享网络。 主机2&#xff1a;x64 intel &#xff0c;系统&#xff1a;ope…

字体体积压缩

环境:python3 关键步骤: pip install fontTools目录详情: 执行 pyftsubset.exe SourceHanSansCN-Medium.ttf --text-file3500.txt然后打开:TTF To Woff2,选择文件上传,等待处理,下载,使用 附常用汉字,字体文件请善用百度 3500.txt 工才下寸丈大与万上小口山巾千乞川亿个…

Redis队列与Stream

Redis队列与Stream、Redis 6多线程详解 Redis队列与StreamStream总述常用操作命令生产端消费端单消费者消费组消息消费 Redis队列几种实现的总结基于List的 LPUSHBRPOP 的实现基于Sorted-Set的实现PUB/SUB&#xff0c;订阅/发布模式基于Stream类型的实现与Java的集成消息队列问…

thinkphp6入门(23)-- 如何导入excel

1. 安装phpexcel composer require phpoffice/phpexcel composer update 2. 前端 <form class"forms-sample" action"../../xxxx/xxxx/do_import_users" method"post" enctype"multipart/form-data"><div class"cont…

cron表达式使用手册

cron表达式 我们在使用定时调度任务的时候&#xff0c;最常用的就是cron表达式。通过cron表达式来指定任务在某个时间点或者周期性执行。 范围&#xff1a; 秒&#xff08;0-59&#xff09;&#xff08;可选&#xff09; 分&#xff08;0-59&#xff09; 时&#xff08;0-…

如何对图像进行聚类

文章来源&#xff1a;https://medium.com/voxel51/how-to-cluster-images-6e09bdff7361 2024 年 4 月 10 日 使用 FiftyOne、Scikit-learn和特征嵌入 在 2024 年深度学习的计算密集型环境中&#xff0c;集群一词最常出现在讨论 GPU 集群时--高度优化的矩阵乘法机器的大规模集…

uniapp开发小程序手写板、签名、签字

可以使用这个插件进行操作 手写板-签名签字-lime-signature - DCloud 插件市场 但是目前这个插件没有vue3 setup Composition API的写法。所以对于此文档提供的可以直接使用,需要使用Composition API方式实现的,可以继续看。 因为Composition API方式,更加的简单、灵活,…

错题记录(2)

来源&#xff1a; FPGA开发/数字IC笔试系列(10) 笔试刷题 笔试 | 海思2022数字IC模拟卷&#xff08;真题模拟&#xff0c;带解析&#xff09; 运算符优先级

Python项目移动文件夹后出现ModuleNotFoundError: No module named

文章目录 0 问题再现1 问题原因2 结局办法2.1 如果是使用编译器运行2.2 如果是在linux环境下&#xff0c;使用命令运行 0 问题再现 移动Python的项目文件夹后&#xff0c;代码出现模块引用未知的问题。 1 问题原因 移动Python项目后&#xff0c;source root&#xff08;项目…

基于YOLOv8的河道漂浮物实时检测系统【训练和系统源码+Pyside6+数据集+包运行】

✨目录 一、系统概述和展示&#x1f384;1.1 摘要 &#x1f388; 二、一站式使用教程&#x1f384;三、YOLOv8原理剖析&#x1f384;3.1 YOLOv8背景和技术原理&#x1f388; 四、模型训练、评估和推理&#x1f384;4.1 数据集介绍&#x1f388;4.2 模型训练&#x1f388;4.3 结…

搭建个人智能家居 4 -WS2812B-RGB灯

搭建个人智能家居 4 - WS2812B-RGB灯 前言说明ESPHomeHomeAssistant 前言 上一篇文章我们已经完成了第一个外设的添加&#xff08;一个LED灯&#xff09;&#xff0c;今天接着来“壮大”这个系统&#xff0c;添加第二个外设“RGB灯”。 环境搭建可以回顾前面的文章。前文回顾&…

OpenCV轻松入门(六)——简单图片处理【马赛克、毛玻璃、浮雕效果】

马赛克效果 马赛克指现行广为使用的一种图像&#xff08;视频&#xff09;处理手段&#xff0c;此手段将影像特定区域的色阶细节劣化并造成色块打乱的效果&#xff0c;因为这种模糊看上去有一个个的小格子组成&#xff0c;便形象的称这种画面为马赛克。其目的通常是使之无法辨…