首页 > 其他分享 >标准IO之文件定位 | 文件IO读写

标准IO之文件定位 | 文件IO读写

时间:2024-08-08 12:59:51浏览次数:11  
标签:文件 读写 位置 偏移 IO 缓冲区 SEEK

标准IO之文件定位

1.fseek(目标文件,偏移量,参考点)

功能:将stream流文件中的文件指针从whence位置开始偏移offset字节的长度。

参数:stream 要移动文件指针的目标文件流对象

offset要在文件内偏移的距离,单位字节,如果值为整数,则向文件末尾偏移如果值为负数,则向文件开头偏移偏移的起始位置,由系统定义的三个宏开始。

SEEK SET文件的开头位置  SEEK CUR.文件的当前位置  SEEK END文件的末尾位置

注意:

1.不支持设备文件,一般用于普通文件。

2.如果从文件的指定位置向后偏移过程中已经超过了文件的当前末尾位置,则会自动以"0"来填充文件内容,从而形成一种被称为"空洞文件"的特殊文件。

3.特殊操作:偏移量也可以+n,指针后移,需要写文件,跳过空间自动补\0;以当前Pos为参考点

4.返回值:成功为0,失败为-1;

2.ftell(可以获得文件大小)

可以直接用fseek偏移到最后,返回头文件刚开始到pos的字节数

获得完大小之后,若要复制文件需要将pos移到开头

3.rewind(使读写指针直接复位到0)

缓冲区:

存储类设备为块设备(512byte)计算机有高速低速设备,内存速度非常快,硬盘非常慢,为了让他们速度匹配。缓冲区主要在内核中.

行缓冲

1.遇到\n刷新

2.验证缓冲区满刷新

3.程序正常结束刷新

4.fflush刷新(不调stdin,stdout)

全缓冲

1.缓存区满刷新

2.程序正常结束刷新

3.用fflush fflush(fp)

无缓冲

主要用于错误信息报错,与终端关联

fprintf(标准错误输出)

文件io读写操作

1.操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用。 其中文件IO都是对设备文件操作,当然也可以对普通文件进行操作。
2.一个基于Linux内核的没有缓存的I0机制
3.与标准IO的区别:没有缓存区,操作对象不在是流,而是文件描述符
4.文件描述符:很小的非负的整数,本质为int 0-1023
5.内核每打开一个文件就会获得一个文件描述符

6.在./a.out中,打开文件只开不关只能打开1024个

7.拿到的文件描述符从3开始

8.文件io标准头文件 unistd.h,stdio为c库头文件

9.POSIX可移植标准

10.文件io没有缓冲区:更适合操做硬件操作

11.固态硬盘在硬件层面上也有缓冲区;

12.在./a.out中,打开文件只开不关只能打开1024个

13.c库对系统调用进行封装

1.open

open(文件名,标志位,(666,777读写执行权限))

flag必须包含以下三个其中之一

1.O_RDONLY文件必须存在

2.常用还有O_CREAT创造   O_TRUNC 清空

3.fopen (a+ 追加 文件原来位置不变,在文件最后写),open为O_OPPEND追加

4.如果标志位有creat,要给权限,一般为0666

2.write

write(fd,要写入的内容(字符串,二进制都可以),本次写入有效长度)

返回值:

1.成功返回写入字节数,0不代表错误(特殊设备);

2.失败返回-1;

3.close

close(fd)

4.read

read(读谁,往哪存,数量,最大读取长度)

返回值:

1.成功返回实际得到字节数;二进制最多使用read;

2.文件到达结尾返回 0;

3.失败返回 -1;

文件拷贝

5.lseek

lseek(调整文件读写位置)

off_t lseek(int fd, off_t offset, int whence);

功能:

1.定位光标的位置

2.参数:

fd:文件描述符 

3.offset:偏移量:正:向后偏移,负:向前偏移,零:不偏移
whence:SEEK_SET,SEEK_CUR ,SEEK_END
返回值:成功返回偏移量off_t,失败返回-1

默认覆盖写

补充:当文件为NULL时,feof 参数 FILE*fp,检测是否结束,ferror 检测是否出错

文件读取时发生错误

clearer 清除标志位

标签:文件,读写,位置,偏移,IO,缓冲区,SEEK
From: https://blog.csdn.net/m0_72137961/article/details/140959243

相关文章

  • Visual Studio Community安装WebForm创建和数据连接
    目录一、安装VisualStudioCommunity1.下载VisualStudioCommunity2.双击安装3.配置二、项目创建1.创建新项目2.配置新项目3.创建web窗体4.代码分部5.文件打开问题三、数据库访问1.自己先装一个sqlserver2.创建实体数据模型3.创建连接4.修改更新 四、项目......
  • Java 中 Exception 和 Error 有什么区别?
    1.ExceptionException代表程序正常运行过程中可以预料到的意外情况,应该被开发者捕获并进行相应处理。2.ErrorError指在正常情况下不太可能出现的情况。大部分Error导致程序处于不正常、不可恢复的状态,所以不便也不需被开发者捕获,因为这个情况下你捕获了也无济于事......
  • 域控安全:读取ntds.dit文件中的hash值
    多种方式离线读取ntds.dit文件中的hash值多种方式在线读取ntds.dit文件中的hash值多种方式离线读取ntds.dit文件中的hash值离线一般需要两步:1、将远端域控的ntds.dit下载到本地,2、然后利用再在本地进行。注意:因为system.hive里存放着ntds.dit的秘钥,所以需要转储......
  • git前端上传项目忽略本地node_modules文件
    要在Git上传前端代码时忽略node_modules文件夹在项目根目录下查找或创建.gitignore文件:如果你的项目中已经存在.gitignore文件,则打开它进行编辑。如果不存在,就在项目根目录下创建一个新的.gitignore文件。在.gitignore文件中添加node_modules/:打开.gitignore文件,并添加......
  • MYSQL通过sql语句将select查询出来的数据导出到文件中
    脱离数据库管理工具,想直接将select出来的数据导出到一个文件中。使用sql语句:SELECTfild_nameFROMtable_nameINTOOUTFILE'配置文件夹路径/b.xlsx';说明:配置文件夹路径是mysql配置文件中的配置如果不能顺利使用,可能需要修改配置。一、MYSQL配置1.1......
  • [Java SE] 核心源码精讲:java.util.Optional(JDK1.8-)
    1概述:java.util.Optional该类是Java8中引入的一个用于处理可能为null的值的容器类。这是一个容器对象,可能包含或不包含非空值。自Java1.8起支持如果有值存在,isPresent()方法将返回true;而get()方法将返回该值,若无值存在,将报异常java.util.NoSuchElement......
  • 【13.PIE-Engine案例——加载Landsat8 Collection2 SR数据集】
    原始链接原始路径欢迎大家登录航天宏图官网查看本案例原始来源结果展示具体代码/***@File:Landsat8Collection2SR*@Time:2021/5/24*@Author:piesat*@Version:1.0*@Contact:400-890-0662*@License:(C)Copyright航......
  • IO进程----文件IO
    目录IO进程文件IO1. 概念2. 特点3. 函数3.1. 打开文件3.2. 关闭文件3.3. 读写文件readwrite3.4. 文件定位操作文件属性获取目录操作IO进程文件IO1. 概念在posix(可移植操作系统接口)中定义的一组输入输出的函数2. 特点1. 没......
  • [EC Final 2021] Vision Test
    挺牛题,没做出来,但是参考了Rainbow博客之后发现这些套路自己其实都会啊QwQ。我提交的翻译:给定一个长度为\(n\)的数组\(x\),接下来你有\(q\)次询问。第\(i\)次询问给出一个区间\(l,r\),设\(k=r-l+1\),你提取出\(x\)数组下标在\(l,r\)之间的区间\(y_i=x_{i+l}(0\le......
  • 如何把Connection 封装到工具类里面 调用工具类方法实现 增删改查操作 java JDBC
    如何把Connection封装到工具类里面调用工具类方法实现增删改查操作javaJDBC使用数据库连接池以HikariCP为例在JDBC中,使用数据库连接池是一个常见的做法,以提高数据库操作的效率和性能。连接池管理着一组数据库连接,这些连接可以被重用而不是每次需要时都创建新的连接。......