(一)open系统的调用

为了创建一个新的文件描述,需要使用系统调用open

#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
int open(const char* path,int oflags);
int open(const char* path,int oflags,mode_t mode);//mode_t对文件的权限
  • 如果调用成功,则返回非负整数,否则返回-1
  • path:准备打开的文件设备名字
  • oflags:通过必需文件访问模式与可选模式相结合的方式来指定
    1.必需指定的访问模式之一:O_RDONLY(打开只读),O_WDONLY(只写),O_RDWR(读写)
    2.可选模式:O_APPEND(追加),O_TRUNC(若果文件存在,则删除,然后新建一个空的),O_CREAT(如果文件将会新建),O_EXCL

(二)close系统调用

#include<unistd.h>
int close(int fildes);
  1. 可以使用close系统调用终止文件描述符fildes
  2. 若调用成功,返回0,失败返回-1

例子

  #include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main()
{
int fd;
char *name="open.txt";
if(fd=open(name,O_CREAT|O_RDONLY,0644)<0)
perror("open: ");
else
printf("Open file success\n");
if(close(fd)<0)
perror("close: ");
else
printf("Closed file success\n");
}

Ubuntu系统操作步骤:

  1. vim open.c //创建文件
  2. 点击i,进入插入模式
  3. 输入代码
  4. 点击esc键,输入:,在输入wq
  5. gcc open.c//编译
  6. ./a.out//运行

(三)read系统调用

  • read系统调用:与文件描述符filds相关联的文件里读入nbytes个字节数据,并把它们放入buff中。他返回实际读入的字节数,若返回0,就表示未读入任何数据;返回-1,就表示发生错误
  • read系统调用的原型:
 #include<unistd.h>
size_t read(int filds,void *buf,size_t nbytes);

(三)write系统调用

  • write系统调用:把缓冲区buf前的nbytes个字节写入与文件描述符filds关联的文件中。他返回实际写入的字节数。若返回0,就表示未写入任何数据;返回-1,表示发生了错误
  • 原型:
 #include<unistd.h>
size_t write(int filds,const void *buf,size_t nbytes)

例子

#include <stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
int main()
{
int fd,size;
char s[]="hello",buffer[80]={0};
fd=open("1.txt",O_WRONLY|O_CREAT,0644);
write(fd,s,sizeof(s));
close(fd);
fd=open("1.txt",O_RDONLY);
read(fd,buffer,sizeof(buffer));
close(fd);
printf("buffer = %s\n",buffer);
}

(四)文件读写位置控制

#include<unistd.h>
#include<sys/types.h>
off_t lseek(int fildes,off_t offset,int whence);

lseek系统调用对文件描述符filds的读写指针进行设置,可以用它设置文件下一个读写位置(可以跳跃读写)

  • offset指定位置,正数向后移,负数向前移
  • whence:
    • SEEK_SET:开始出
    • SEEK_CUR:当前位置
    • SEEK_END:末尾
  • 失败返回-1,成功返回从文件头到文件指针被设置处的字节偏移值

例子

#include <stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
int main()
{
int fd,size;
char s[]="hello,word!",buffer[80]={0};
fd=open("1.txt",O_RDWR|O_CREAT,0644);
write(fd,s,sizeof(s));//写完指针到达文件末尾
memset(buffer,0,sizeof(buffer));//清空buffer
read(fd,buffer,sizeof(buffer));//read只能向后读,而此时指针在文件末尾,所以为空
printf("1.buffer = %s\n",buffer);
lseek(fd,-12,SEEK_CUR);//从当前位置向前跳跃12个位置(还有一个\0,所以11+1),到达文件头
memset(buffer,0,sizeof(buffer));
read(fd,buffer,sizeof(buffer));
printf("2.buffer = %s\n",buffer);
lseek(fd,0,SEEK_SET);
memset(buffer,0,sizeof(buffer));
read(fd,buffer,3);//读3个hel,文件指针也在此处
printf("3.buffer = %s\n",buffer);
memset(buffer,0,sizeof(buffer));
read(fd,buffer,sizeof(buffer));//从4个开始
printf("4.buffer = %s\n",buffer);
lseek(fd,-7,SEEK_END);
memset(buffer,0,sizeof(buffer));
read(fd,buffer,sizeof(buffer));
printf("5.buffer = %s\n",buffer);
}

linux操作系统读写文件操作(c语言)的更多相关文章

  1. 3)Linux程序设计入门--文件操作

    )Linux程序设计入门--文件操作 Linux下文件的操作 前言: 我们在这一节将要讨论linux下文件操作的各个函数. 文件的创建和读写 文件的各个属性 目录文件的操作 管道文件 .文件的创建和读 ...

  2. Linux系统编程@文件操作(一)

    只总结了部分常用的内容,详细内容参考<UNIX环境高级编程>及相关书籍. Linux中文件编程可以使用两种方法 Linux系统调用(依赖于系统) C语言库函数(不依赖于系统) Linux系 ...

  3. Linux C 程序 文件操作(Linux系统编程)(14)

    文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...

  4. c++中读写文件操作

    读写文件这个,不常用,每次用的时候都会百度一下,每次写法还都不一样,所有总是记混.今天利用点时间总结下之前工程中用过的.以后就安照这种方法写了. 搞acmicpc的时候喜欢用freopen(),这个是 ...

  5. linux编程之文件操作

    在linux下用文件描述符来表示设备文件盒普通文件,文件描述符是一个整型的数据,所有对文件的操作都是通过文件描述符来实现的. 文件描述符是文件系统中连接用户空间和内核空间的枢纽,当我们打开一个或者创建 ...

  6. Linux驱动 读写文件【转】

    转自:http://blog.csdn.net/h_armony/article/details/7546624 在VFS的支持下,用户态进程读写任何类型的文件系统都可以使用read和write着两个 ...

  7. linux下的文件操作——批量重命名

    概述:在日常工作中,我们经常需要对一批文件进行重命名操作,例如将所有的jpg文件改成bnp,将名字中的1改成one,等等.文本主要为你讲解如何实现这些操作 1.删除所有的 .bak 后缀: renam ...

  8. node.js的fs核心模块读写文件操作 -----由浅入深

    node.js 里fs模块 常用的功能 实现文件的读写 目录的操作 - 同步和异步共存 ,有异步不用同步 - fs.readFile 都不能读取比运行内存大的文件,如果文件偏大也不会使用readFil ...

  9. Xshell6远程访问linux及Xftp6远程针对linux系统中文件操作(附图文详解)

    1.首先我们需要先做好前期准备工作,需要到XManager6官网上将Xshell及Xftp下载并安装,安装过程一直下一步就好了.这里是其官网:http://www.xshellcn.com/.安装完成 ...

  10. Linux 目录和文件操作

    Linux常用命令--目录和文件操作 [目录]删除.复制.移动 : 1.删除文件夹用:rmdir 文件夹名 但是rmdir不能删除非空的文件夹,那如何删除非空文件夹呢: 2.通常情况下,删除文件用:r ...

随机推荐

  1. 一文帮你搞定H5、小程序、Taro长列表曝光埋点

    对于很多前端同学来说,"埋点"常常是一个不愿面对却又无法逃避的话题.为什么这么说呢,相信很多前端同学都深有体会:首先埋点这个事基本是前端"独享"的,服务端基本不 ...

  2. hexo博客主题,git上传,报错Template render error的解决方案

    报错信息 INFO Start processing FATAL Something's wrong. Maybe you can find the solution here: http://hex ...

  3. 【技术积累】Linux中的命令行【理论篇】【二】

    ag命令 命令介绍 ag命令是一个用于在Linux系统中进行文本搜索的工具.它是基于Silver Searcher的改进版本,具有更快的搜索速度和更强大的功能. ag命令的基本用法是在指定的目录中搜索 ...

  4. 一文了解react中定义样式(css/less/sass)的常用方法

    react中通过jsx的语法方式,将html标签和js语法联系在一起,而css的编写方式,没有明确的指定编写方式,目前就有很多不同方法,每个方式各有其优缺点,我们一起来看看常用的定义方式有哪些. 最基 ...

  5. 发布关于PostGIS对于USD格式的拓展

    我们非常高兴的发布为了一年一度的SIGGRAPH 2023发布关于为PostGIS支持USD格式的新拓展. 新添加了3个函数 ST_AsUSDA(geom geometry, usd_root_nam ...

  6. Windows查找监听端口对应的进程及其路径

    前言 假设扫描到1234端口存在可疑进程,需要找到该监听端口对应的进程及其进程文件的全路径,判断是否为可疑程序. 步骤 启动命令行:按win + r键,然后输入"cmd" 查看端口 ...

  7. 一文理解GIT的代码冲突

    对于GIT,不知道有没有人和我一样,很长时间都是小心翼翼.紧张兮兮,生怕一不小心,自己辛苦写的代码没了. 特别是代码冲突,更是难到我无法理解,每次都要求助于百度,跟着人家的教程一步步解决,下一次还是这 ...

  8. Go 语言中排序的 3 种方法

    原文链接: Go 语言中排序的 3 种方法 在写代码过程中,排序是经常会遇到的需求,本文会介绍三种常用的方法. 废话不多说,下面正文开始. 使用标准库 根据场景直接使用标准库中的方法,比如: sort ...

  9. 【路由器】小米 WR30U 解锁并刷机

    本文主要记录个人对小米 WR30U 路由器的解锁和刷机过程,整体步骤与 一般安装流程 类似,但是由于 WR30U 的解锁 ssh 和刷机的过程中有一些细节需要注意,因此记录一下 解锁 ssh 环境准备 ...

  10. C#是否应该限制链式重载的设计模式?

    1.代码的可阅读性 一眼看懂是什么意思,并且能看出生成的SQL是什么样的 var list = db.Queryable<Student>() .GroupBy(it => it.N ...