Linux系统文件编程(1)
打开文件
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
open----返回的是文件描述符是整形数(文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。)打开成功返回非负数,失败返回-1。
pathname----要打开的文件名称。
flags-----是打开文件的权限包含
{
O_RDONLY——只读打开
O_WRONLY——只写打开
O_RDWR——可读可写打开(常用)
}
示例如下
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
int main()
{int fd;fd=open("./file1",O_RDWR);//file1是要打开的文件,fd是文件描述符printf("fd=%d\n",fd);return 0;
}
ps:头文件可用man手册查看
Mode---- 一定是在flags中使用了O_CREAT标志,mode记录待创建文件的访问权限。
权限:
{
可读 r 4
可写 w 2
可执行 x 1
}
例如:0600 表示可读可写(4+2=6)
文件不存在则打开失败要用到O_CREAT
示例如下
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
int main()
{int fd;fd=open("./file1",O_RDWR);if(fd==-1){printf("open file1 fail");fd=open("./file1",O_RDWR|O_CREAT,0600);//文件不存在则创建文件,0600是待创建文件的权限。if(fd>0){printf("creat file1 fd=%d\n",fd);}}return 0;
}
写入文件
ssize_t write(int fd, const void *buf, size_t count);
第一个参数是文件描述符
第二个参数是缓冲区(就是要写入内容的指针)
第三个参数是要写入文件的大小
若写入成功返回写入的字节数,失败则返回-1.
代码示例
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{int fd;char*buf="i am handsome";//将要写入文件的内容fd=open("./file1",O_RDWR);//"./file1" is wenjianlujingif(fd==-1){printf("open file1 fail\n");fd=open("./file1",O_RDWR|O_CREAT,0600);if(fd>0){printf("creat file1\n");}}printf("open successful fd=%d\n",fd);write(fd,buf,strlen(buf));//strlen计算字符串的长度,sizeof()在这里计算的是指针的大小close(fd);//写完文件后要关闭文件return 0;}
文件的读取
ssize_t read(int fd, void *buf, size_t count);
fd:文件描述符
buf:把读取的数据放到buf中
count:所要读取的字节数
若成功则返回读取的字节数,失败返回-1.
代码示例
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{int fd;char*buf="i am handsome";//将要写入文件的内容fd=open("./file1",O_RDWR);//"./file1"是文件路径if(fd==-1){printf("open file1 fail\n");fd=open("./file1",O_RDWR|O_CREAT,0600);if(fd>0){printf("creat file1\n");}}printf("open successful fd=%d\n",fd);int n_write=write(fd,buf,strlen(buf));//返回字节的长度if(n_write!=-1){printf("write successfuli %d\n",n_write);}close(fd); 重新打开定位光标(光标在文件的头)fd=open("./file1",O_RDWR);char*readbuf;readbuf=(char *)malloc(n_write*sizeof(char));int n_read=read(fd,readbuf,n_write);printf("read %d,context %s\n",n_read,readbuf);close(fd);return 0;
}
文件光标的移动操作
off_t lseek(int fd, off_t offset, int whence);
fd:文件描述符
offset:将读写指针相对whence移动offset个字节,负数向前偏移,正数向后偏移
whence:
{ SEEK_SET:文件的头SEEK_CUR:当前位置SEEK_END:文件的尾
}
调用成功返回从当前位置到文件头所偏移的字节数,失败则返回-1.
代码改进
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{int fd;char*buf="i am handsome";//将要写入文件的内容fd=open("./file1",O_RDWR);if(fd==-1){printf("open file1 fail\n");fd=open("./file1",O_RDWR|O_CREAT,0600);if(fd>0){printf("creat file1\n");}}printf("open successful fd=%d\n",fd);int n_write=write(fd,buf,strlen(buf));if(n_write!=-1){printf("write successfuli %d\n",n_write);}
// close(fd);
// fd=open("./file1",O_RDWR);lseek(fd,-n_write,SEEK_END);char*readbuf;readbuf=(char *)malloc(n_write*sizeof(char));int n_read=read(fd,readbuf,n_write);printf("read %d,context %s\n",n_read,readbuf);close(fd);return 0;
}
可利用lseek计算文件的字节数
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include <unistd.h>
#include <string.h>#include <stdlib.h>
int main()
{int fd;char*buf="i am handsome";fd=open("./file1",O_RDWR);int filesize=lseek(fd,0,SEEK_END);printf("size=%d\n",filesize);close(fd);return 0;
}
Linux系统文件编程(1)相关推荐
- linux文件编程(2)——系统文件描述符、动静态文件、块设备介绍
参考:linux文件编程(2)--文件操作原理简述之文件描述符.动静态文件.块设备 作者:丶PURSUING 发布时间: 2021-04-09 11:14:12 网址:https://blog.csd ...
- 嵌入式Linux多任务编程 进程 管道 命名管道
进程 进程是一个可并发执行的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统执行资源分配和保护的基本单位. 程序的一次执行就是一个进程 一个程序可以派生多个进程 多个不同程序运行的时候, ...
- 嵌入式Linux系统编程学习之二常用命令
嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...
- I.MX6U嵌入式Linux应用编程学习
I.MX6U嵌入式Linux应用编程学习 目录 I.MX6U嵌入式Linux应用编程学习 〇.备忘 0.0 本文大写字母缩写说明 0.1 C编译 0.2 NFS与文件夹挂载 一.应用编程概念 1.1 ...
- alin的学习之路(Linux系统编程:一)(Linux基础命令)
alin的学习之路(Linux系统编程:一)(Linux基础命令) 1.Linux学习准备 操作系统的作用 向上给用户提供简单的操作计算机硬件的方式 对下管理硬件 承上启下 程序运行在操作系统上,程序 ...
- Linux网络编程--进程间通信(一)
进程间通信简介(摘自<Linux网络编程>p85) AT&T 在 UNIX System V 中引入了几种新的进程通讯方式,即消息队列( MessageQueues),信号量( s ...
- Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...
- 外网访问arm嵌入式linux_嵌入式Linux系统编程——文件读写访问、属性、描述符、API
Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...
- linux高性能网络编程,Linux高性能网络编程的介绍
Linux高性能网络编程 一.课程目标 本次课程深入讲解Linux下的socket编程,并以此为基础,着重讨论如何提高网络服务端应用的性能,通过本次课程的学习,学员将收获以下方面的成果: 熟练使用so ...
最新文章
- Camera噪声问题
- python实现获取文件列表中每个文件关键字
- 木兰编程语言python_国产编程语言木兰换皮Python 中科院重罚当事人
- 如何编写服务器文档记录
- java rest风格传参_SpringMVC的REST风格的四种请求方式总结
- 3. 什么是icmp?icmp与ip的关系_你知道如何跟女生,确定恋人关系吗?
- python计算运动会某个参赛选手的得分。数据保存在文件中_成绩计算电脑程序的使用说明...
- Docker简介以及Docker历史
- clickhouse原理解析与应用实践 pdf_阿里专家分享内部绝密RocketMQ核心原理与最佳实践PDF...
- div区域内容抓取_企业微信群机器人应用:使用python从网站抓取行业资讯并定时推送...
- ftp文件推送 linux_Linux 终端访问 FTP 及 上传下载 文件
- 【安卓9】数据库升级
- python购物车进阶(函数)
- mirdeep2使用笔记
- 使用PCtoLCD2002字模提取软件
- 2019腾讯广告算法大赛题目理解与数据探索(含代码)
- 永中word页码怎么从第二页开始_Word文档”双面打印“全攻略,解决打印难题!...
- vue3.0脚手架搭建(vscode)
- Unity Shader 绘制朱利亚集合 Julia 奇幻图形
- 数字冰雹-智慧监所可视化分析决策系统
热门文章
- 把windows装到linux下,如何将WSL(Windows Subsystem for Linux 2)安装到Windows 10?
- 【hash】Seek the Name, Seek the Fame
- windebug常用命令
- 在ubuntu 16.04上安装tensorflow,并测试成功
- 如何制作pem公钥证书和私钥证书
- 20144303 20145239 实验三
- Magento Block设计分析(深入分析)
- IOS-C语言第12天,(函数指针)Point and macro(宏)
- HFileOutputFormat与TotalOrderPartitioner
- hdu 2141 Can you find it? hdu1597 find the nth digit