IO相关操作

IO相关操作

  对于IO操作而言,有四个基本的操作:open 、read 、write 、close 我们来逐个解释。

    在此之前我们先解释一下什么是文件描述符

文件描述符

  操作系统通过一个整数开代表打开的文件,我们将这个整数称为文件描述符。

  文件描述符的范围 [ 0 ~ 1024 ] 不同的系统可能上限不同 具体查看方法? `

   ulimit -n

  0:标准输入 stdin

  1:标准输出 stdout

  2:标准错误 stderr

  系统选择文件描述符的方法,从小到大找第一个未被使用 的文件描述符,

  一般从3开始 因为0 、1 、 2 已经被系统占用。

open

   int open(const char *path , int flag);

  功能 : 打开文件

  参数 :

  path :要打开的额文件

  flags :打开方式

    O_RDONLY:只读方式打开

    O_WRONLY:只写方式打开

    O_RDWR :读写方式打开

  返回值 :

    失败 : -1

    成功 : 文件描述符

   int open (const char *path , int flags , mode_t mode )

  功能:创建文件

  参数:

    *path:要创建的文件名

    flags :O_CREAT | O_EXCL 若不存在,则创建

    mode :给文件的权限

read

   int read(int fd , char *buf, size_t len);

  功能 :

  从 fd 文件中读取数据到buf所指向的空间,该空间大小为 len

  参数 :

    fd :open 函数返回的文件描述符

    *buf : 要读入数据的空间

    len :读取的长度  

  返回值 :

    失败 : -1

    成功 :实际读取的长度

write

   int write (int fd , const char *buf , size_t len );

  往 fd 所指向的文件写入数据, 数据的起始地址为buf ,大小为 len

close

   int close (int fd ) ;

  关闭文件

lseek

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

  定位到指定位置

  参数:

  offset : 偏移量

  whence :

    SEEK_SET 文件开始

    SEEK_CUR 文件当前指向

    SEEK_END 文件结尾

  返回值:

    相对于文件开头的偏移多少字节

 

结合以上函数 写一个简单的拷贝函数

  参考代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <fcntl.h>
 4 #include <string.h>
 5 #include <errno.h>
 6 ?
 7 //usage : copy src dst
 8 int main(int argc , char* argv[]){
 9     if(argc != 3 ){
10         fprintf(stderr,"usage : %s src dst \n", argv[0]);
11         exit(1);
12     }
13     //打开源文件
14     int fd_src = open (argv[1], O_RDONLY);
15     if(fd_src == -1 ) perror("open"),exit(0);
16
17     // 打开目标文件 ,若不存在则创建
18     int fd_dst = open (argv[2], O_CREAT|O_RDWR|O_EXCL, 0644);
19     if(fd_dst == -1 && errno == EEXIST ){
20         printf("目标存在,是否覆盖(Y/N)\n");
21         char choose ;
22         scanf(" %c", &choose);
23         if(choose == ‘Y‘ || choose == ‘y‘){
24             fd_dst = open(argv[2],O_RDWR);
25             if(fd_dst == -1)perror("open"),exit(1);
26         }else{
27             exit(0);
28         }
29     }
30
31     //循环读取源文件,写入目标文件
32     char buf[1024+1];
33     while(1){
34         memset(buf, 0x00 , sizeof(buf));
35         int r = read(fd_src, buf, 1024);
36
37         if(r <= 0)break;
38
39         write(fd_dst, buf, r);
40     }
41 ?
42     //关闭文件
43
44     close(fd_src);
45     close(fd_dst);
46 }

?

原文地址:https://www.cnblogs.com/YeLing0119/p/9782842.html

时间: 2024-11-09 01:43:56

IO相关操作的相关文章

关于golang中IO相关的Buffer类浅析

io重要的接口 在介绍buffer之前,先来认识两个重要的接口,如下边所示: type Reader interface { Read(p []byte) (n int, err error) } type Writer interface { Write(p []byte) (n int, err error) } 上边两个接口在golang sdk安装目录src/io/io.go中定义.后边凡是涉及到io相关操作的,基本上都实现了这两个接口,如: 1. package bufio 中的Rea

java目录相关操作 示例代码

package org.rui.io; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; /** * 目录列表器 测试 * * @author lenovo * */ //Args:"C:/Users/lenovo/Pictures/screen/*\.jpg" public class DirList { public

关于C#资源文件的相关操作

关于资源文件的相关操作. //1.比较常见的有获取资源文件对应的文件流,然后转换到相对应的文件 //比较典型的做法是通过代码程序集加载指定资源 //如下通过Assembly的静态方法GetExecutingAssembly()得到程序集 //还有很多方式可以得到代码程序集 System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); Stream manifestResourceStream

java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例

package org.rui.io.xml; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.List; import nu.xom.Document; import nu.

Delphi FMX 手机目录提取,把IO相关的都提取到System.IoUtils单元中

Delphi把IO相关的都提取到System.IoUtils单元中.路径操作使用TPath的方法都很方便.uses System.IoUtils TPath.GetTempPath//临时目录TPath.GetCameraPath//照相机目录(照片/录像)TPath.GetMusicPath//音乐目录TPath.GetDownloadsPath//下载目录……如果使用TPath类的静态方法那么代码就是跨平台的,在Windows,Mac,iOS,Android上都能用.如果仅仅对Android

EasyARM i.mx28学习笔记——文件IO方式操作GPIO

0 前言 本文描述如果通过文件IO sysfs方式控制EasyARM GPIO端口.通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO输出或获得GPIO输入. Linux学习可从应用出发,先不纠结Linux驱动编写,先把Linux给玩起来. [相关博文] [EasyARM

SQL Server中与IO相关的等待类型:IO_COMPLETION和PAGEIOLATCH_*

原文:SQL Server中与IO相关的等待类型:IO_COMPLETION和PAGEIOLATCH_* 一个大的SQL语句操作,执行计划中包含了一个merge join操作,观察到SQL长时间处于IO_COMPLETION等待状态,如果是读取相关的表的数据,服务器应该全力为其服务,但是服务器的物理IO又远远没有达到瓶颈.这个IO_COMPLETION到底是在做什么?是表的数据页IO请求还在其他操作?如果是,跟PAGEIOLATCH_*是什么区别?如果不是,又是什么类型的操作? IO_COMPL

二叉树的相关操作

#include<stdio.h> #include<malloc.h> #define MAXSIZE 20 typedef char TEelemtype; typedef struct BiTNode{ TEelemtype data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //队列的方式 typedef struct queueelem { BiTNode* b[MAXSIZE]; int front,rear;

(二十四)linux新定时器:timefd及相关操作函数

timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itim