05文件与IO
ssize_t read(int fd, void *buf, size_t count);
返回值
如果出现错误,返回-1
读文件结束,返回0
否则返回从该文件复制到规定的缓冲区中的字节数
ssize_t write(int fd, const void *buf, size_t 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 |
文件位置 |
|
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);
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的更多相关文章
- 【Go】使用压缩文件优化io (二)
原文链接: https://blog.thinkeridea.com/201907/go/compress_file_io_optimization2.html 上一篇文章<使用压缩文件优化io ...
- node源码详解(七) —— 文件异步io、线程池【互斥锁、条件变量、管道、事件对象】
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource7 本博客同步在https://cnodejs.o ...
- 文件和IO流
摘要:本文主要介绍了Java的文件处理以及常用的IO流操作. 文件操作 概念 File是数据源(保存数据的地方)的一种,可以表示一个文件,也可以表示一个文件目录. File类只能对文件和文件夹进行创建 ...
- Atitit.跨语言 文件夹与文件的io操作集合 草案
Atitit.跨语言 文件夹与文件的io操作集合 草案 1. Jdk原生的太难用了..1 2. PS: apache commons-io包,FileUtils有相关的方法,IOUtils一般是拷 ...
- PythonCookBook笔记——文件与IO
文件与IO 所有的程序都要处理输入与输出,涉及到文本.二进制文件.文件编码和对文件名.目录的操作. 读写文本数据 需要读写各种不同编码的文本数据,使用rt模式的open()函数. 该读写操作使用系统默 ...
- 提高生产力:文件和IO操作(ApacheCommonsIO-汉化分享)
复制.移动.删除.比较.监控.文件读写 等文件和IO操作是编程中比较常用的功能. 幸运的是,Apache Commons IO等开源组件已经帮我们实现了. 我们可以不用重复 ...
- linux系统编程之文件与io(四)
今天继续学习文件与io,主要是学习文件共享及文件.复制文件描述符,有点抽象,主要是概念上的理解,但是很重要,下面一一来分解: 文件共享: 回顾一下,在linux系统调用中,是通过文件描述符来访问文件的 ...
- linux系统编程之文件与io(二)
今天继续学习文件与io,话不多说,开始进入正题: 文件的read和write系统调用: 说明:函数中出现在size_t和ssize_t是针对系统定制的数据类型: 下面以一个实现文件简单拷贝的示 ...
- linux系统编程之文件与io(一)
经过了漫长的学习,C语言相关的的基础知识算是告一段落了,这也是尝试用写博客的形式来学习c语言,回过头来看,虽说可能写的内容有些比较简单,但是个人感觉是有史起来学习最踏实的一次,因为里面的每个实验都是自 ...
随机推荐
- Day07_面向对象第二天
1.构造方法(掌握) 1.构造方法的特点(掌握) A.方法名必须和类名保持一致 B.没有返回值类型并且没有具体的返回值 2.构造方法的作用(掌握) 给对象的属性初始 ...
- Kubuntu麦克风音频无声音
前段时间买了新本,装了双系统,win8和kubuntu 14.04,使用的过程感觉都不错,因为平时玩游戏看视频是用win8,但最近打算在kubuntu上听音乐时,发现音频没有声音,麦克风也没有声音,这 ...
- java List 排序 Collections.sort() 对 List 排序
class User { String name; String age; public User(String name,String age){ this.name=name; this.a ...
- mysql最大连接数
通常,mysql的最大连接数默认是100, 最大可以达到16384.1.查看最大连接数:show variables like '%max_connections%';2.修改最大连接数方法一:修改配 ...
- makefile--模式规则(七)
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 上一节讲到目录创建成功,目标文件没有生产到对应目录下,这里我们先给目标文件加上对应目录,这样的话 ...
- CentOS配置LAMP环境
环境:CentOS 6.5 配置防火墙,开启80端口.3306端口 # Firewall configuration written by system-config-firewall # Manua ...
- poj1502 最短路
题意:有n个处理器,给出n*n的邻接矩阵的一半,表示相互之间传输信息的花费(另一半与给出的一半对称,即双向都可传输),x表示不能传输,问从第一个处理器传输到所有处理器的最小花费总和是多少. 就是跑一遍 ...
- web开发注意的问题
1.<input type="submit" value="提交"> 将表单提交<form action="login.jsp ...
- dede后台栏目文章问题
栏目下的子栏目文档,并不记在主栏目文档数中,让我一直以为程序错误.
- 在easyui datagrid中formatter数据后使用linkbutton
http://ntzrj513.blog.163.com/blog/static/2794561220139245411997/ formatter:function(value,rowData,ro ...