(一)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. Chrome浏览器,有道云笔记的网页剪报需要多次登录且收藏失败报错

    报错代码 {"canTryAgain":false,"scope":"SECURITY","error":"2 ...

  2. 《最新出炉》系列入门篇-Python+Playwright自动化测试-8-上下文(Context)

    1.简介 其实前边的文章中也提到过Context,只不过是 一笔带过,但是宏哥觉得在playwright中挺重要的,所以宏哥今天单独将其拎出来讲解和分享一下,希望对您有所帮助或者参考. 2.前言 Pl ...

  3. Redis的设计与实现-总结

    个人真的很喜欢这本书, 从对C语言一窍不通, 到发现C语言竟然如此简洁, 以至于我喜欢上了C! 对此前面的底层数据结构也读了几次, 大致整理了书里的内容, 后面的就粗略看了一下, 不再细细整理了. R ...

  4. 使用 virt-install 命令创建虚拟机

    实践 参考文档:官方手册 这个命令适用于创建第一个虚拟机,后面如果再增加,修改xml文件或者使用clone命令就可以了. centos.sh #!/bin/bash name='centos7' is ...

  5. 建设数字工厂:MRP物料需求计划的逻辑原理与配置方法

    本文分享自华为云社区<数字工厂深入浅出系列(七): MRP物料需求计划的逻辑原理与配置方法>,作者:云起MAE. MRP是生产制造企业"管好"物料的核心工具方法,基本思 ...

  6. CF1601 题解

    偶然看这一场的题目,忽然很有感觉,于是写了一下 A 题面 考虑每一位可以单独分开考虑 考虑单独的一位,每次要选 \(m\) 个位置,可能产生贡献的位置就是这位为 1 的数,设数量为 \(x\),则 \ ...

  7. Dokcer学习之旅(1)——运行一个简单的容器

    基本概念 镜像 我们都知道,操作系统分为 内核 和 用户空间.对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持.而 Docker 镜像(Image),就相当于是一个 ...

  8. SimpleDateFormat 线程安全问题修复方案

    问题介绍 在日常的开发过程中,我们不可避免地会使用到 JDK8 之前的 Date 类,在格式化日期或解析日期时就需要用到 SimpleDateFormat 类,但由于该类并不是线程安全的,所以我们常发 ...

  9. 万字长文硬核AQS源码分析

    阅读本文前,需要储备的知识点如下,点击链接直接跳转. java线程详解 Java不能操作内存?Unsafe了解一下 一文读懂LockSupport AQS简介 AQS即AbstractQueuedSy ...

  10. Java 多线程处理 for 循环数据

    对于必须在for循环内进行查询的场景,可采用以下几种方式进行优化. 1.主线程与子线程无先后顺序 public static void main(String[] args) throws Inter ...