文件读写和文件指针的移动

摘要:
write函数-#include-ssize_twrite;把buf中的count个字节写入fd所指的文件中,返回实际写入的字节数,有错误发生则返回-1。写入文件时,文件读写指针会随着写入的字节数移动。";if//O_RDWR可读写O_CREAT创建O_TRUNC文件清空my_err;else{printf("Creatfilesuccess!!=strlen)//写入文件,write的返回值是实际写入的字节数my_err;my_read;//读出数据printf;if//从文件结尾处向后移动10位my_err;//_LINE_预编译器内置宏,表示行数if(write(fd,write_buf,strlen(write_buf))!=strlen)//写入文件,write的返回值是实际写入的字节数my_err;my_read;close;//关闭文件return0;}lseek允许文件指针移到EOF之后,会以

read 函数

  -#include <unistd.h>

  -ssize_t read(int fd, void *buf, size_t count);

从fd 所指的文件中读取count 个字节到buf 中。返回实际读取到的字节数,有错误发生则返回-1。读取文件时,文件读写指针会会随着读取到的字节数移动。

write 函数

 - #include <unistd.h>

 - ssize_t write(int fd, const void *buf, size_t count);

把buf中的count个字节写入fd 所指的文件中, 返回实际写入的字节数,有错误发生则返回-1。写入文件时,文件读写指针会随着写入的字节数移动。

lseek 函数:控制文件指针的位置

-#include <sys/types.h>
 -#include <unistd.h>

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

offset 根据whence 来移动文件指针的位移数

whence 取值 :

取值含义
SEEK_SET从文件开始处向后移动 offset
SEEK_CUR从文件指针当前位置处向后移动 offset,负数时向前移动offset
SEEK_END从文件结尾处向后移动 offset,负数时向前移动offset

成功返回当前的读写位置,也就是距离文件开始处多少个字节,错误返回-1

常用操作:

用法含义
lseek( int fd , 0,SEEK_SET)移动到文件开头
lseek(int fd, 0, SEEK_END)移动到文件结尾i
lseek(int fd, 0, SEEK_CUR)获取当前位置(相对于文件开头的偏移量)

实例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
void my_err(const char *err_string ,int line )
{
    fprintf(stderr,"line:%d " ,line) ; //fprintf()函数根据指定的格式(format)向输出流(stream)写入数据,把后面的写到前面
    perror(err_string) ;//先输出err_string ,再输出错误原因
    exit(1) ;
}
int  my_read(int fd) //读数据函数
{
    int len ;
    int ret ;
    int i ;
    char read_buf[64] ;
    if((lseek( fd , 0 ,SEEK_END))== -1) //移动文件指针到结尾
        my_err("lseek",__LINE__) ; //__LINE__  预编译器内置宏,表示行数
    if((len=lseek(fd,0,SEEK_CUR)) ==  -1 ) //求相对于文件开头的偏移量,用于表明文件开始处到文件当前位置的字节数 len
        my_err("lseek",__LINE__) ; 
    if((lseek(fd,0,SEEK_SET)) ==  -1 ) //移动文件指针到开头 
        my_err("lseek",__LINE__) ; 
    printf(" 字节数是 : %d 
",len) ;
    if((ret = read(fd,read_buf,len)) < 0) //成功时返回实际读到的字节数,失败返回 -1
        my_err("read",__LINE__ ) ;
    for(i= 0 ;i< len ;i++)
        printf("%c",read_buf[i]) ;
    printf("
") ;
    return  ret ;
}
int main(void)
{
    int fd ;
    char write_buf[32]="Hello Word !!" ;
    if((fd =open("example_63.c",O_RDWR | O_CREAT |O_TRUNC ,S_IRWXU))== -1) //O_RDWR 可读写 O_CREAT 创建 O_TRUNC 文件清空
        my_err("open",__LINE__) ;
    else{
        printf("Creat file success !!
") ;
    }
    if(write(fd,write_buf,strlen(write_buf)) != strlen(write_buf) ) //写入文件,write 的返回值是实际写入的字节数
        my_err("write",__LINE__) ;
    my_read(fd) ;    //读出数据
    printf("/*--------------------------------------------*/
") ;
    if(lseek(fd,10,SEEK_END)== -1) //从文件结尾处向后移动10位
    my_err("lseek",__LINE__) ; //_LINE_  预编译器内置宏,表示行数
    if(write(fd,write_buf,strlen(write_buf)) != strlen(write_buf) ) //写入文件,write 的返回值是实际写入的字节数
        my_err("write",__LINE__) ;
    my_read(fd) ;
    close(fd) ; //关闭文件
    return  0;
}

这里写图片描述

这里写图片描述

lseek 允许文件指针移到EOF之后,会以

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇开源软件源码阅读小技巧DB2导入导出 学习笔记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#堆和栈

堆和栈是两种可以分配的内存。 栈保存代码的运行路径。堆保存对象。 栈好比整齐摆放的盒子。堆则好比杂乱无章的盒子。 在堆中我们可以轻易找到需要的对象,而由于默认访问最顶端的栈,当栈中的方法执行完毕之后就会丢弃,然后继续查找最顶端的盒子,直到发现合适的。 借用其他博主的图片。左边是栈,右边是堆。 栈是内存自主维护的。而堆则需要垃圾回收机制 堆和栈主要存放了四...

虚函数表

(https://www.cnblogs.com/vipchenwei/p/7466018.html?utm_source=debugrun&utm_medium=referral) 一、 VPTR指针:虚指针(含有虚函数的类对象中都有一个需指针) 虚函数表:含有虚函数的类对象中都有一个虚函数表   这里我们主要来探究一下,编译器在什么地方动了手脚...

C++使用new和不使用new创建对象区别

前言 在使用面向对象的时候,发现使用new和不使用new创建的对象区别还是蛮大的,做个总结; 总结 new创建的是一个指向类对象的指针,需要指针进行接收,一处初始化,多处使用,但是不用new创建的话不需要指针,其创建的是一个类对象; new创建一个实例对象,并且指针指向该对象,作用域变成了全局,使用完时需要用delete进行销毁;但是不用new创建的话,...

Java网络编程和NIO详解6:Linux epoll实现原理详解

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how2playlife.com 本文是微信公众号【Java技术江湖】的《不可轻视的Java网络编程》其中一篇,本文部分内...

海康SDK编程指南(C#二次开发版本)

海康SDK编程指南 目前使用的海康SDK包括IPC_SDK(硬件设备),Plat_SDK(平台),其中两套SDK都需单独调用海康播放库PlayCtrl.dll来解码视频流,返回视频信息和角度信息。本文仅对视频监控常用功能的使用进行说明,其它未实现功能请参看设备网络SDK使用手册和播放库编程指南V7.2。 IPC_SDK编程指南 (一) SDK的引用 由于I...

Linux 系统中堆栈的使用方法

本节内容概要描述了Linux内核从开机引导到系统正常运行过程中对堆栈的使用方式。这部分内容的说明与内核代码关系比较密切,可以先跳过。在开始阅读相应代码时再回来仔细研究。 Linux 0.12系统中共使用了4种堆栈。第1种是系统引导初始化时临时使用的堆栈;第2种是进入保护模式之后提供内核程序初始化使用的堆栈,位于内核代码地址空间固定位置处。该堆栈也是后来任务...