Unix/Linux环境C编程入门教程(40) 初识文件操作
1.函数介绍
|
close(关闭文件) |
|
|
相关函数 |
open,fcntl,shutdown,unlink,fclose |
|
表头文件 |
#include<unistd.h> |
|
定义函数 |
int close(int fd); |
|
函数说明 |
当使用完文件后若已不再需要则可使用close()关闭该文件,二close()会让数据写回磁盘,并释放该文件所占用的资源。参数fd为先前由open()或creat()所返回的文件描述词。 |
|
返回值 |
若文件顺利关闭则返回0,发生错误时返回-1。 |
|
错误代码 |
EBADF 参数fd 非有效的文件描述词或该文件已关闭。 |
|
附加说明 |
虽然在进程结束时,系统会自动关闭已打开的文件,但仍建议自行关闭文件,并确实检查返回值。 |
|
范例 |
参考open() |
|
|
|
|
creat(建立文件) |
|
|
相关函数 |
read,write,fcntl,close,link,stat,umask,unlink,fopen |
|
表头文件 |
#include<sys/types.h> |
|
定义函数 |
int creat(const char * pathname, mode_tmode); |
|
函数说明 |
参数pathname指向欲建立的文件路径字符串。Creat()相当于使用下列的调用方式调用open() |
|
错误代码 |
关于参数mode请参考open()函数。 |
|
返回值 |
creat()会返回新的文件描述词,若有错误发生则会返回-1,并把错误代码设给errno。 |
|
附加说明 |
creat()无法建立特别的装置文件,如果需要请使用mknod()。 |
|
范例 |
请参考open()。 |
|
|
|
|
dup(复制文件描述词) |
|
|
相关函数 |
open,close,fcntl,dup2 |
|
表头文件 |
#include<unistd.h> |
|
定义函数 |
int dup (int oldfd); |
|
函数说明 |
dup()用来复制参数oldfd所指的文件描述词,并将它返回。此新的文件描述词和参数oldfd指的是同一个文件,共享所有的锁定、读写位置和各项权限或旗标。例如,当利用lseek()对某个文件描述词作用时,另一个文件描述词的读写位置也会随着改变。不过,文件描述词之间并不共享close-on-exec旗标。 |
|
返回值 |
当复制成功时,则返回最小及尚未使用的文件描述词。若有错误则返回-1,errno会存放错误代码。错误代码EBADF参数fd非有效的文件描述词,或该文件已关闭。 |
|
|
|
|
dup2(复制文件描述词) |
|
|
相关函数 |
open,close,fcntl,dup |
|
表头文件 |
#include<unistd.h> |
|
定义函数 |
int dup2(int odlfd,int newfd); |
|
函数说明 |
dup2()用来复制参数oldfd所指的文件描述词,并将它拷贝至参数newfd后一块返回。若参数newfd为一已打开的文件描述词,则newfd所指的文件会先被关闭。dup2()所复制的文件描述词,与原来的文件描述词共享各种文件状态,详情可参考dup()。 |
|
返回值 |
当复制成功时,则返回最小及尚未使用的文件描述词。若有错误则返回-1,errno会存放错误代码。 |
|
附加说明 |
dup2()相当于调用fcntl(oldfd,F_DUPFD,newfd);请参考fcntl()。 |
|
错误代码 |
EBADF 参数fd 非有效的文件描述词,或该文件已关闭 |
|
|
|
|
fcntl(文件描述词操作) |
|
|
相关函数 |
open,flock |
|
表头文件 |
#include<unistd.h> |
|
定义函数 |
int fcntl(int fd , int cmd); |
|
函数说明 |
fcntl()用来操作文件描述词的一些特性。参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令。 |
|
返回值 |
成功则返回0,若有错误则返回-1,错误原因存于errno. |
|
|
|
|
flock(锁定文件或解除锁定) |
|
|
相关函数 |
open,fcntl |
|
表头文件 |
#include<sys/file.h> |
|
定义函数 |
int flock(int fd,int operation); |
|
函数说明 |
flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。 |
|
参数 |
operation有下列四种情况: |
|
返回值 |
返回0表示成功,若有错误则返回-1,错误代码存于errno。 |
|
|
|
|
fsync(将缓冲区数据写回磁盘) |
|
|
相关函数 |
sync |
|
表头文件 |
#include<unistd.h> |
|
定义函数 |
int fsync(int fd); |
|
函数说明 |
fsync()负责将参数fd所指的文件数据,由系统缓冲区写回磁盘,以确保数据同步。 |
|
返回值 |
成功则返回0,失败返回-1,errno为错误代码。 |
|
|
|
|
lseek(移动文件的读写位置) |
|
|
相关函数 |
dup,open,fseek |
|
表头文件 |
#include<sys/types.h> |
|
定义函数 |
off_t lseek(int fildes,off_t offset ,int whence); |
|
函数说明 |
每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头,若是以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。当read()或write()时,读写位置会随之增加,lseek()便是用来控制该文件的读写位置。参数fildes 为已打开的文件描述词,参数offset 为根据参数whence来移动读写位置的位移数。 |
|
参数 |
whence为下列其中一种: |
|
返回值 |
当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码。 |
|
附加说明 |
Linux系统不允许lseek()对tty装置作用,此项动作会令lseek()返回ESPIPE。 |
|
范例 |
参考本函数说明 |
|
|
|
|
mkstemp(建立唯一的临时文件) |
|
|
相关函数 |
mktemp |
|
表头文件 |
#include<stdlib.h> |
|
定义函数 |
int mkstemp(char * template); |
|
函数说明 |
mkstemp()用来建立唯一的临时文件。参数template 所指的文件名称字符串中最后六个字符必须是XXXXXX。Mkstemp()会以可读写模式和0600 权限来打开该文件,如果该文件不存在则会建立该文件。打开该文件后其文件描述词会返回。文件顺利打开后返回可读写的文件描述词。若果文件打开失败则返回NULL,并把错误代码存在errno 中。 |
|
错误代码 |
EINVAL 参数template 字符串最后六个字符非XXXXXX。EEXIST 无法建立临时文件。 |
|
附加说明 |
参数template所指的文件名称字符串必须声明为数组,如: |
|
范例 |
#include<stdlib.h> |
|
执行 |
template = template-lgZcbo |
|
|
|
|
open(打开文件) |
|
|
相关函数 |
read,write,fcntl,close,link,stat,umask,unlink,fopen |
|
表头文件 |
#include<sys/types.h> |
|
定义函数 |
int open( const char * pathname, int flags); |
|
函数说明 |
参数pathname 指向欲打开的文件路径字符串。下列是参数flags 所能使用的旗标: |
|
返回值 |
若所有欲核查的权限都通过了检查则返回0 值,表示成功,只要有一个权限被禁止则返回-1。 |
|
错误代码 |
EEXIST 参数pathname 所指的文件已存在,却使用了O_CREAT和O_EXCL旗标。 |
|
附加说明 |
使用access()作用户认证方面的判断要特别小心,例如在access()后再作open()空文件可能会造成系统安全上的问题。 |
|
范例 |
#include<unistd.h> |
|
执行 |
Linux Programmer! |
|
|
|
|
read(由已打开的文件读取数据) |
|
|
相关函数 |
readdir,write,fcntl,close,lseek,readlink,fread |
|
表头文件 |
#include<unistd.h> |
|
定义函数 |
ssize_t read(int fd,void * buf ,size_t count); |
|
函数说明 |
read()会把参数fd 所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read()不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。 |
|
附加说明 |
如果顺利read()会返回实际读到的字节数,最好能将返回值与参数count 作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期。 |
|
错误代码 |
EINTR 此调用被信号所中断。 |
|
范例 |
参考open()。 |
|
|
|
|
sync(将缓冲区数据写回磁盘) |
|
|
相关函数 |
fsync |
|
表头文件 |
#include<unistd.h> |
|
定义函数 |
int sync(void) |
|
函数说明 |
sync()负责将系统缓冲区数据写回磁盘,以确保数据同步。 |
|
返回值 |
返回0。 |
|
|
|
|
write(将数据写入已打开的文件内) |
|
|
相关函数 |
open,read,fcntl,close,lseek,sync,fsync,fwrite |
|
表头文件 |
#include<unistd.h> |
|
定义函数 |
ssize_t write (int fd,const void * buf,size_t count); |
|
函数说明 |
write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。当然,文件读写位置也会随之移动。 |
|
返回值 |
如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。 |
|
错误代码 |
EINTR 此调用被信号所中断。 |
|
范例 |
请参考open()。 |
2.小试牛刀
学习了这么多函数的用法,我们需要将这个函数全部揉在一起写一个小demo了哦。
流程设计:
首先创建一个文件 使用open或者create函数
然后往里面写入一个字符串缓冲区的内容
利用sync函数(将缓冲区数据写回磁盘)
将内容读取出来
关闭文件
Demo源码
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <stdio.h>
int main(void)
{
int fd; //文件描述符
int size; //标记字节数
char s [ ]="Just test it!\n"; //作为输入缓冲区
char buffer[80]; //作为输出缓冲区
fd=open("/tmp/test.txt",O_WRONLY|O_CREAT);
if(fd > 0)
printf("打开文件/tmp/test.txt 成功\n");
//ssize_t write (int fd,const void * buf,size_t count);
size = write(fd,s,sizeof(s));
if(size <= sizeof(s))
printf("写入文件成功%d字节\n",size);
//刷新缓冲区
sync();
printf("刷新文件缓冲区\n");
close(fd);
printf("关闭文件缓冲区\n");
fd=open("/tmp/temp",O_RDONLY);
//ssize_t read(int fd,void * buf ,size_t count);
size=read(fd,buffer,sizeof(buffer));
if(size <= sizeof(buffer))
printf("文件已经度去完成\n");
close(fd);
printf("文件关闭\n");
printf("文件内容为:%s\n",buffer);
return 0;
}
平台效果
在RHEL7上
在MAC上
Unix/Linux环境C编程入门教程(40) 初识文件操作的更多相关文章
- Unix/Linux环境C编程新手教程(40) 初识文件操作
1.函数介绍 close(关闭文件) 相关函数 open,fcntl,shutdown.unlink,fclose 表头文件 #include<unistd.h> 定义函数 int ...
- Unix/Linux环境C编程入门教程(36) 初识shell
1.什么是Shell Shell是位为一组,依次代表文件拥有者.同组用户和其他用户的存取权限.通常文件共有3个权限,"r"表示只读:"w"表示可写:&qu ...
- Unix/Linux环境C编程入门教程(32) 环境变量那些事儿
1. getenv() putenv()setenv()函数介绍 getenv(取得环境变量内容) 相关函数 putenv,setenv,unsetenv 表头文件 #include<stdli ...
- Unix/Linux环境C编程入门教程(1) Solaris 11 64bit环境搭建
Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 本文就带大家来安装Solaris 11 64位并且配置好C/C++开发环境 本文所 ...
- Unix/Linux环境C编程入门教程(19)Red Hat Entetprise Linux 7.0环境搭建
位架构,包括英特尔X-86_64.Power和s390.动态定时能力将降低内核内部中断数量,Open vSwitch 2.0功能可调节虚拟机之间的流量.RHEL 7中默认的文件系统是XFS,包含了一个 ...
- Unix/Linux环境C编程入门教程(5) Red Hat Enterprise Linux(RHEL)环境搭建
Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 通过./a.out ./Y.out执行出结果,证明C++程序编译成功,也就说明li ...
- Unix/Linux环境C编程入门教程(4) Debian Linux环境搭建
Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 1.广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品,由于Deb ...
- Unix/Linux环境C编程入门教程(3) Oracle Linux 环境搭建
Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 2010年9月,Oracle Enterprise Linux发布新版内核--Un ...
- Unix/Linux环境C编程入门教程(2) CentOS环境搭建
Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 本文就带大家来安装CentOS并且配置好C/C++开发环境,这是一款Linux. ...
随机推荐
- authbind start tomcat services as user with less that 1024 ports. linux常规用户使用tomcat的80端口
Start tomcat services using authbind this will allow user to start ports less than 1024 we do not ne ...
- BZOJ3016: [Usaco2012 Nov]Clumsy Cows
3016: [Usaco2012 Nov]Clumsy Cows Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 71 Solved: 52[Submi ...
- 【转】ubuntu中的Wine详解
原文网址:http://blog.csdn.net/iwtwiioi/article/details/10530561 什么是wine?(转自百度百科,具体看百科) wine,是一款优秀的Linux系 ...
- AIR检测网络
package com.juyou.util.net { import flash.events.StatusEvent; import flash.net.URLRequest; import ai ...
- Hadoop 1、在虚拟机上进行 HDFS 安装
一.准备条件 1.四台Linux虚拟机(1台NameNode节点,1台Secondary节点(Secondary和其中1台DataNode共用),外加2台DataNode) 2.下载Hadoop版本, ...
- javascript实现的手风琴折叠菜单效果
演示地址:http://codepen.io/anon/pen/pJERMq 实现效果: HTML代码: <!DOCTYPE html> <html lang="en&qu ...
- 实战ffs函数
这个函数是返回整形的最低位1的位置 自己写是这个样子的: /* Find the first bit set in I. */ int lx_ffs(int i) { int index = 0, r ...
- OCP-1Z0-051-题目解析-第28题
28. Which two statements are true regarding constraints? (Choose two.) A. A foreign key cannot cont ...
- core_cm3文件函数一览
core_cm3是ARM公司推出来的统一规定,这是对下游芯片厂商的统一规定,因此可以再Cortex-M3(CM3)之间进行移植.此文件中定义了一些对特殊功能寄存器的C语言形式的操作,本质上是内敛汇编和 ...
- [Redux] Redux: Extracting Container Components -- AddTodo
Code to be refactored: const AddTodo = ({ onAddClick }) => { let input; return ( <div> < ...