这节主要学习了read、write、lseek、目录访问(opendir、readdir、closedir)这几个系统调用及其简单的应用。
一旦有了与一个打开文件描述相连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节

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

fd :想要读的文件的文件描述符
buf : 指向内存块的指针,从文件中读取来的字节放到这个内存块中
count : 从该文件复制到buf中的字节个数

返回值

如果出现错误,返回-1

读文件结束,返回0

否则返回从该文件复制到规定的缓冲区中的字节数

用write()系统调用将数据写到一个文件中

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

fd:要写入的文件的文件描述符
buf: 指向内存块的指针,从这个内存块中读取数据写入        到文件中
count: 要写入文件的字节个数

返回值

如果出现错误,返回-1

如果写入成功,则返回写入到文件中的字节个数

下面是一个简单的从一个文件中读取内容写入到另一个文件中去:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> #include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while(0) int main(int argc, char *argv[])//这里用传参传入原文件和目标文件
{
int infd;
int outfd;
if (argc != 3)
{
fprintf(stderr, "Usage %s src dest\n", argv[0]);
exit(EXIT_FAILURE);
}
infd = open(argv[1], O_RDONLY);//打开原文件
if (infd == -1)
ERR_EXIT("open src error");
//打开目标文件
if ((outfd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1)
ERR_EXIT("open dest error"); char buf[1024];
int nread;
while ((nread = read(infd, buf, 1024)) > 0)
{
write(outfd, buf, nread);
} close(infd);
close(outfd);
return 0;
}

值得注意的是在用完文件描述符后最好的习惯就是关闭,做到随用随关。

要做到文件的随机读写就要涉及到另一个系统调用lseek了:

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

fd:需设置的文件标识符

ofset:偏移量

base:搜索的起始位置

返回值:返回新的文件偏移值
base有以下几种取值:

base

文件位置

SEEK_SET

从文件开始处计算偏移

SEEK_CUR

从当前文件的偏移值计算偏移

SEEK_END

从文件的结束处计算偏移

看一个小例子:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> #include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while(0) int main(void)
{
int fd;
fd = open("test.txt", O_RDONLY);
if (fd == -1)
ERR_EXIT("open error"); char buf[1024] = {0};
int ret = read(fd, buf, 5);
if (ret == -1)
ERR_EXIT("read error");
printf("buf=%s\n", buf); ret = lseek(fd, 0, SEEK_CUR);//从当前位置偏移0个量即获取当前偏移位置
if (ret == -1)
ERR_EXIT("lseek"); printf("current offset=%d\n", ret);
return 0; }

下面介绍一下目录的相关操作:

打开一个目录:

DIR*  opendir(char *pathname);

pathname:目录的路径,路径可以是相对的也可以是绝对的

返回值:

打开成功,返回一个目录指针

打开失败,则返回0

下面是涉及到访问打开的目录中的一些连接的细节:

struct  dirent*  readdir(DIR  *dirptr);

这里用到了打开目录返回的DIR指针

返回值:

返回一个指向dirent结构的指针,它包含指定目录中下一个连接的细节;

没有更多连接时,返回0

当然最后也是一样,打开目录,用完了也要习惯的关闭一下:

int closedir (DIR  *dirptr);

返回值:调用成功返回0,失败返回-1
这里还要介绍一下一个非常重要的结构体:

struct dirent

{

long d_ino;

off_t d_off;

unsigned short d_reclen;

char d_name [NAME_MAX+1];   //这是我们比较关心和常用的就是目录下的文件名字

}

下面是一个实现基本ls功能的小程序:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> #include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <dirent.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while(0) int main(void)
{
DIR *dir = opendir("."); //打开当前目录
struct dirent *de; //定义一个包含文件细节的结构题
while ((de = readdir(dir)) != NULL) //循环读取目录中的信息
{
if (strncmp(de->d_name, ".", 1) == 0) //这个起到过滤以.开始的文件
continue; printf("%s\n", de->d_name);
} closedir(dir); //最后关闭
exit(EXIT_SUCCESS); //和return 0作用类似
}

  

05文件与IO的更多相关文章

  1. 【Go】使用压缩文件优化io (二)

    原文链接: https://blog.thinkeridea.com/201907/go/compress_file_io_optimization2.html 上一篇文章<使用压缩文件优化io ...

  2. node源码详解(七) —— 文件异步io、线程池【互斥锁、条件变量、管道、事件对象】

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource7 本博客同步在https://cnodejs.o ...

  3. 文件和IO流

    摘要:本文主要介绍了Java的文件处理以及常用的IO流操作. 文件操作 概念 File是数据源(保存数据的地方)的一种,可以表示一个文件,也可以表示一个文件目录. File类只能对文件和文件夹进行创建 ...

  4. Atitit.跨语言  文件夹与文件的io操作集合  草案

    Atitit.跨语言  文件夹与文件的io操作集合  草案 1. Jdk原生的太难用了..1 2. PS: apache commons-io包,FileUtils有相关的方法,IOUtils一般是拷 ...

  5. PythonCookBook笔记——文件与IO

    文件与IO 所有的程序都要处理输入与输出,涉及到文本.二进制文件.文件编码和对文件名.目录的操作. 读写文本数据 需要读写各种不同编码的文本数据,使用rt模式的open()函数. 该读写操作使用系统默 ...

  6. 提高生产力:文件和IO操作(ApacheCommonsIO-汉化分享)

    复制.移动.删除.比较.监控.文件读写 等文件和IO操作是编程中比较常用的功能.        幸运的是,Apache Commons IO等开源组件已经帮我们实现了.        我们可以不用重复 ...

  7. linux系统编程之文件与io(四)

    今天继续学习文件与io,主要是学习文件共享及文件.复制文件描述符,有点抽象,主要是概念上的理解,但是很重要,下面一一来分解: 文件共享: 回顾一下,在linux系统调用中,是通过文件描述符来访问文件的 ...

  8. linux系统编程之文件与io(二)

    今天继续学习文件与io,话不多说,开始进入正题: 文件的read和write系统调用: 说明:函数中出现在size_t和ssize_t是针对系统定制的数据类型:     下面以一个实现文件简单拷贝的示 ...

  9. linux系统编程之文件与io(一)

    经过了漫长的学习,C语言相关的的基础知识算是告一段落了,这也是尝试用写博客的形式来学习c语言,回过头来看,虽说可能写的内容有些比较简单,但是个人感觉是有史起来学习最踏实的一次,因为里面的每个实验都是自 ...

随机推荐

  1. mysql [ERROR] Can't create IP socket: Permission denied

    /*************************************************************************** * mysql [ERROR] Can't c ...

  2. 消格子时一个很深的bug的修复纪录

    环境: cocos2d-x 2.2.2  jsb   条件:当快速在格子中来回拖拽选取时,会一直在计算指尖和格子的真实区域是否碰撞,   报错:touchMOve时由于不停的调用BOxItem的get ...

  3. cocosbuilder3.0使用小记

    新项目用到了堪称完美的cocos2d-x2.1.5版本,用cocsbuilder2.1版本出现了返回的最终node为null的问题,看xcode的提示说: cocos2d: WARNING! Inco ...

  4. Apache详细介绍 - [ Apache v2.4.10 for Windows ]

    详细介绍 - [ Apache v2.4.10 for Windows ] 下载:http://down.admin5.com/fuwuqi/Apache_Windows.html Apache是世界 ...

  5. Java-->List&Set

    一.List集合 特点:有序可重复 List集合的猜想: 1.每个元素是不是应该有序号 index 2.addFirst.addLast.set(intdex, 对象) 3.get(index)... ...

  6. dll清理

    結束了閉關,又得與人類交流了,只好裝QQ 印象中企鵝手腳一向是BAT中最乾淨的-結果還是裝了不少樂色,一併挖出來除之   C:\program files\common files\tencent\q ...

  7. spark-scheduled调度算法

    1.3源码是如此,后面新版本源码会尽可能的根据用户shell配置的参数进行分配 1.spareadOutApps 尽可能分配到多的机器上面execute和CPU core 2.非spareadouta ...

  8. android开源项目---blog篇

    本文转载于:http://blog.csdn.net/likebamboo/article/details/19081241 主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织.Follow大 ...

  9. java的nio之:java的nio系列教程之channel的数据交换

    在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel. transferFro ...

  10. 《剑指Offer》之二维数组中的查找

    1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 2.代码实现 pu ...