Linux系统编程:文件I/O编程
文件I/O操作在Linux编程时是经常会使用到的一个内容,通常可以把比较大的数据写到一个文件中来进行存储或者与其他进程进行数据传输,这样比写到一个全局数组或指针参数来实现还要方便好多。
一、文件常用操作与相关函数
1.打开或创建一个文件:编写程序时涉及内容——打开或创建文件的路径名称、打开文件的方式(读|写|执行)、访问权限(用户|组|其他)、实现方式(系统调用|库)。
①系统调用方式:
#include <fcntl.h> //函数原型声明、flags定义
#include<sys/stat.h> //mode定义
int open( const char * pathname,int flags, mode_t mode);//当需要创建新的文件时才需要使用第3个参数mode
pathname:不带路径时默认在当前目录下
flags:打开方式,常用选项——O_RDWR(读写打开)、O_RDONLY(只读打开)、O_WRONLY(只写打开)、O_CREAT(文件不存在时创建)、
mode:使用O_CREAT时设置访问权限,常用选项——S_IRUSR(用户可读)、S_IWUSR(用户可写)、S_IXUSR(用户可执行)
返回值:成功——文件描述符(int),失败——(-1)
打开一个文件操作结束之后要记得关闭文件,与其对应的函数:
#include<unistd.h>
int close(int fd);
②库函数方式:
#include<stdio.h>
FILE * fopen(const char * path,const char * mode);//FILE是文件流结构
path:文件路径名,包括文件名
mode:打开文件的方式。注意!这个形参是指针。编程时要使用字符串的形式。常用设置——b:以二进制格式打开或创建文件、t:打开文本文件、r:只读、w:只写、+:只要有加号出现就表示可读可写、a:append追加的意思,往文件末尾插入,这样就不会覆盖掉原来的内容。根据需要进行组合设置。
返回值:成功——指向FILE文件流的指针,失败——NULL。
与其对应的关闭函数:
#include<stdio.h>
int fclose(FILE * stream);
该函数会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。成功执行返回0。
2.设置文件指针的位置:文件指针是读写文件操作时的起始位置,直接关系到读写的结果。进行读写操作时需要明确当前文件指针所处的位置。
①系统调用方式:
#include<unistd.h>
#include<sys/types.h>
off_t lseek(int fildes,off_t offset ,int whence);
whence:设置文件位置时的参考点——SEEK_SET 参数offset即为新的读写位置、SEEK_CUR 以目前的读写位置往后增加offset个位移量、SEEK_END 将读写位置指向文件尾后再增加offset个位移量
返回值:成功——设置成功之后的文件位置(距离文件起始位置),失败——(-1)
②库函数方式:
#include<stdio.h>
int fseek(FILE * stream,long offset,int whence);
参数和lseek()函数一模一样
返回值:成功——(0),失败——(-1)
3.写内容到文件:涉及内容——写的位置、内容、大小等,写完之后文件“指针”位置会跟着向后移动。
①系统调用方式:
#include<unistd.h>
ssize_t write (int fd,const void * buf,size_t count);
返回值:成功——写入的字节数,失败——(-1)
②库函数方式:
#include<stdio.h>
size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
返回值:成功——写入的字节数
4.读出文件内容:从文件指针处,读出count个字节数到buf指针指向的存储区
①系统调用方式:
#include<unistd.h>
ssize_t read(int fd,void * buf ,size_t count);
返回值:成功——读出的字节数,失败——(-1)
②库函数方式:
#include<stdio.h>
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
返回值:成功——读出的字节数
二、编程演示
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> int main()
{
int fd,ret,rdlen;
char tmp[];
fd = open("./myfile",O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);
ret = chown(file_name,,);
if( ret< )
printf("chown() error.\n");
lseek(fd,,SEEK_SET);
rdlen = read(fd,tmp,);
if(rdlen<)
{
printf("read local file error.\n");
return -;
}
return ;
}
三、问题记录
问1.为什么有系统调用方式来实现文件I/O操作还要库函数方式?
答1.系统调用需要进行用户空间和内核空间之间的切换,这种切换对CPU的开销大,如果大量使用系统调用会大大降低CPU的工作效率,为了解决这个问题于是有了库函数方式,他是一种带缓冲区的操作,当用户空间缓冲区满或者写操作结束时,才将用户缓冲区的内容写到内核缓冲区,同样的道理,当内核缓冲区满或写结束时才将内核缓冲区内容写到文件对应的硬件平台,如此一来就大大减少了系统调用的次数,大大提高CPU工作效率。
问2.write和fwrite函数把内容写到文件中是以哪种格式写入的?为什么用软件打开自己写的文件时会乱码?vim中如何以16进制格式显示打开的二进制文件?
答2.在linux下这两个函数都是以二进制的格式把内容写到文件里边的。像Uedit软件打开文件时他是会根据文件的后缀名来对文件进行转格式显示出来的,也就是说,大多情况下我们看到的内容和文件中实际的存储格式是不一样的。vim中如果要打开一个二进制文件要加“-b”选项,打开后在命令模式下输入“:%!xxd”即可让二进制文件内容以16进制格式来显示,16进制更容易让我们从中获取数据的信息。
问3.如何创建一批文件,要求文件名具有某种格式?
答3.使用sprint()函数对文件名进行格式化处理。
问4.如何修改文件的所有者?
答4.发现程序执行第一遍程序时可以成功执行,第二次运行出错,原来是文件权限问题,不知为毛默认创建的文件的所有者是“root”,为了下一次在用户模式下程序可以正常执行就得改变文件的所有者,使用chown()函数,在上边的那个demo里边就使用了这个函数。
Linux系统编程:文件I/O编程的更多相关文章
- Linux系统中文件定位与查找
Linux系统中文件查找 关键词 文件查找 | find | locate 本文主要介绍有关文件查找的两个命令——find和locate,以及压缩打包的命令——compress, gzip,bzip2 ...
- Linux系统下文件压缩与打包命令
Linux系统下文件压缩与打包命令 常用的压缩文件拓展名 * .Z * .zip * .gz * .bz2 * .xz * .tar * .tar.gz * .tar.bz2 * .tar.xz 压缩 ...
- Linux系统重要文件(二)
Linux系统重要文件概述 一系统自动挂载文件 文件路径信息:/etc/fstab文件作用说明:实现存储设备自动挂载 [root@centos7 ~]# cat /etc/fstab # # /etc ...
- Linux系统重要文件
Linux系统重要文件介绍与配置 一网卡配置文件 (一)网卡配置文件参数介绍 文件路径信息:/ec/sysconfig/network-scripts/ifcfg-eth0 文件作用说明:配置网卡地址 ...
- 实验二:Linux系统简单文件操作命令
項目 内容 这个作业属于哪个课程() 课程链接 这个作业的要求在哪里 实验要求 学号-姓名 17043133-木腾飞 作业学习目标 学习在Linux系统终端下进行命令行操作: 学习掌握常用命令行操作并 ...
- linux系统下文件误删除该如何恢复?
一.linux误删除数据的场景 在实际的工作中,朋友们可能会将linux服务器上的文件不小心误删除掉了.而且越是资历老的工程师越容易犯这样的错误,敲代码的速度也是够快,啪啪rm -rf一个回车,然后就 ...
- linux系统清空文件内容
本文转载至:http://www.jbxue.com/LINUXjishu/14410.html 本文介绍下,在linux系统中,清空文件内容的方法,使用cat命令.echo命令,将文件内容截断为0字 ...
- 树莓派与Linux系统之间文件传输
最近因为要学习Python,于是把放在家里接了一年灰的树莓派又给搜出来了,刚买那会也捣鼓了好一阵子, 基本操作都学会了,但现在又忘光了,只能又从头开始搞了,首先第一个要解决的是怎么把文件从电脑传输到树 ...
- 使用FileZilla从Linux系统下载文件
需求:将Linux系统的的某个文件夹(里面包含文件夹和文件)下载到我Windows系统某个文件夹里 之前我使用xshell下载,但是通过 rz :上传sz:下载 命令中的sz命令,下载失败. 下载 c ...
- Linux系统复制文件/文件夹到远程服务器
从一个服务器复制文件到另一个服务器,或者从本地到远程复制是 Linux 管理员的日常任务之一. 我觉得不会有人不同意,因为无论在哪里这都是你的日常操作之一.有很多办法都能处理这个任务,我们试着加以概括 ...
随机推荐
- linux每天一小步---alias命令详解
1 命令功能 alias命令用来设置指令的别名,alias命令设置的别名只限于该次登陆操作,若要每次登入即自动设好别名,可在/etc/profile或自己的~/.bashrc中设定指令的别名. ...
- CWnd::MoveWindow 详解
CWnd::MoveWindow void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE ); voi ...
- Spring 之 AOP
面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化.AOP 的核心构造是方面, 它将那些影响多个类的行为封装到可重用的模块 ...
- LoadRunner监控SQLServer
监控SQLSERVER时,能增加度量.但是只有系统资源相关的度量有数据,而和sqlserver相关的度量却没有数据. 解决方法: 改为在System Resource Graphs中通过添加Windo ...
- SQLServer中数据加密方法
对SQLServer中的数据进行加密,有三种方法, 1. 在程序语言中先对数据进行加密后再把加密后的数据保存在SQLServer数据库中: 2. 利用SQLServer未公开的加密密码函数,在SQ ...
- java分页实例Demo
前两天测试过的一个分页的demo,在网上看到的,挺好的,就写了下来. 分页也是web里面必须的,有使用的价值. demo文件打包上传了,链接:http://pan.baidu.com/s/1o6sME ...
- Buffer Pool--数据库内存结构
数据库从操作系统申请到的内存可分为两部分:1.缓存池内存(数据页和空闲页)2.非缓存池内存(线程/DLL/连接服务器等) Note:通过服务器实例属性设置的最大/最小服务器内存是指缓存池内存Note: ...
- TSQL--NULL值和三值逻辑
在SQL SERVER 中逻辑表达式存在三种值:TRUE+FALSE+UNKNOWN.UNKNOW可以理解为不确定,既不是TRUE又不是FALSE的表达式,主要由与NULL相关的逻辑判断引起,值为NU ...
- .NET Framework 历史版本(2017年)
.NET简介 这个平台相信我们都知道,不过随着技术发展,现在的.NET平台也今非昔比. .NET平台类似Java平台,是微软于2000年推出的Windows操作系统的应用软件开发框架,发展至今形成巨大 ...
- C#中字段、属性、只读、构造函数赋值、反射赋值的相关
C#中字段.属性和构造函数赋值的问题 提出问题 首先提出几个问题: 1.如何实现自己的注入框架? 2.字段和自动属性的区别是什么? 3.字段和自动属性声明时的直接赋值和构造函数赋值有什么区别? 4.为 ...