文件I/O编程
1 基于linux系统的文件编程
创建文件
int creat(const char * filename,mode_t mode)
filename:要创建的文件名
mode:创建模式
常见模式:
S_IRUSR 可读 4
S_IWUSR 可写 2
S_IXUSR 可执行 1
S_IRWXU 可读、写、执行
示例代码如下:
[retacn@localhost tmp]$ vi file_create.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void create_file(char *filename){
/*指定创建文件的属性*/
if(creat(filename,0755)<0){
printf("create file %s failure!\n",filename);
exit(EXIT_FAILURE);
}else{
printf("create file %s success!\n",filename);
}
}
int main(int argc,char *argv[]){
int i;
if(argc<2){
perror("you haven't input the filename ,please try again!\n");
exit(EXIT_FAILURE);
}
for(i=1;i<argc;i++){
create_file(argv[i]);
}
exit(EXIT_SUCCESS);
return 0;
}
编译
[retacn@localhost tmp]$ gcc file_create.c -o file_create
运行程序创建文件
[retacn@localhost tmp]$ ./file_create hello
create file hello success!
文件描述
所有打开的文件对应一个文件描述符
打开文件
函数原型
int open(const char *pathname,int flags)
int open(const char *pathname,int flags,mode_t mode)
pathname:要打开的文件名(包含路径,缺省为当前路径)
flags:打开标志
常见的打开标志:
O_RDONLY 只读方式打开
O_WRONLY 只写
O_RDWR 读写
O_CREAT 若打开文件不存在,则自动创建(需要指定文件的访问权限mode)
O_EXCL 如果O_CREAT被设置,此指令会检查文件是否存在
O_NOCTTY 如果打开的文件为终端设备,则不会将该终端机当成进程控制终端机
O_TRUNC 若文件存在并且以可写的方式打开,此时文件长度清零,资料消失
O_APPEND 追加方式打开
O_NONBLOCK 非阻塞方式打开,无论有无数据读取或等待,立即返回进程中
示例代码如下:
[retacn@localhost tmp]$ vi file_open.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[]){
int fd;
if(argc<2){
puts("please input the open file pathname!\n");
exit(1);
}
if((fd=open(argv[1],O_CREAT | O_RDWR,0755))<0){
perror("open file failure!\n");
exit(1);
}else{
printf("open file %d success!\n",fd);
}
close(fd);
exit(0);
return 0;
}
[retacn@localhost tmp]$ gcc file_open.c -o file_open
[retacn@localhost tmp]$ ./file_open hello
open file 3 success!
文件的关闭
int close(int fd)
fd:文件描述符
读取文件内容
int read(int fd,const void *buf,size_t length)
fd:文件描述符
buf:读取数据放入缓冲区
length:数据长度
向文件中写入数据
int write(int fd,const void *buf,size_t length)
移动文件的读写位置
int lseek(int fd,offset_t offset,int whence)
文件的读写指针相对whence移动offset个字节
offset:如果取负值,表示向前移动
whence参数值:
SEEK_SET:相对文件开头
SEEK_CUR:相对文件读写指针的当前位置
SEEK_END:相对文件末尾
示例代码:
取得文件长度:
lseek(fd,0,SEEK_END)
文件的访问判断
int access(const char *pathname,int mode)
pathname:文件名
mode:要判断的访问权限
R_OK 可读
W_OK 可写
X_OK 可执行
F_OK 文件存在
正常返回0
示例代码如下:
/*实现文件的考贝*/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#define BUFFER_SIZE 1024
int main(int argc,char *argv[]){
int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE];
char *ptr;
if(argc!=3){
fprintf(stderr,"usage:%s fromfile tofile\n\a",argv[0]);
exit(1);
}
/*打开文件*/
if((from_fd=open(argv[1],O_RDONLY))==-1){
fprintf(stderr,"open %s error:%s\n",argv[1],strerror(errno));
exit(1);
}
/*创建目的文件*/
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1){
fprintf(stderr,"open %s error:%s\n",argv[2],strerror(errno));
exit(1);
}
/*考贝文件*/
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)){
if(bytes_read==-1&&(errno!=EINTR)){
break;
}
else if(bytes_read>0){
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read)){
if(bytes_write==-1&&(errno!=EINTR)){
break;
}
/*读完所有字节*/
else if(bytes_write==bytes_read){
break;
}
else if(bytes_write>0){
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
if(bytes_write==-1){
break;
}
}
}
close(from_fd);
close(to_fd);
exit(0);
return0;
}
[retacn@localhost tmp]$ gcc file_cp.c -o file_cp
[retacn@localhost tmp]$ ./file_cp cp_test cp_test2
文件的描述词
int fcntl(int fd,int cmd)
int fcntl(int fd,int cmd,long arg)
int fcntl(int fd,int cmd,struct flock *lock)
fd:表示要设置的文件描述词
cmd:要操作的指令
文件的锁定
int flock(int fd,int operation)
fd:目标文件
operation:锁定、解除操作
相关推荐
文件I/O基础-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
深入探究文件 I/O:深入了解了文件 I/O 中的一些细节,譬如文件的管理方式、 错误返回的处理、空洞文件、O_APPEND 和 O_TRUNC 标志、原子操作与竞争冒险等等
标准I/O库-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
Linux系统编程笔记涉及到的内容广泛,涵盖了从基础的出错处理到进程管理,从内存管理到进程间通信,以及守护进程设计等多个层面的知识。下面详细说明各个部分的知识点: 1. 常见出错处理 - abort函数用于异常终止...
开发者在这一领域中,从基础的文件系统交互到复杂的网络通信和多线程编程,都能获得丰富的功能支持和灵活性。为了有效地进行Linux系统编程,开发者必须对Linux内核及其底层工作机制有深入的理解。 以下是Linux系统...
### Linux系统编程学习笔记 #### 一、IO **1.1 标准I/O (stdio)** - **fopen/fclose**: `fopen` 用于打开或创建一个文件,并返回一个指向该文件的 `FILE *` 类型的指针。`fclose` 用于关闭由 `FILE *` 指向的文件...
GUN/LINUX系统编程学习笔记,分享快乐。
Linux系统中的TCP/IP编程是网络通信的核心技术,它允许应用程序通过网络进行数据交换。...而提供的“Linux-TCP-IP”文件很可能包含了详细的步骤和示例代码,对于深入学习Linux TCP/IP编程非常有帮助。
【Linux 系统编程与内核驱动开发笔记】 在深入探讨Linux系统编程和内核驱动开发之前,我们首先要理解Linux操作系统的基本概念。Linux是一种自由、开放源码的类Unix操作系统,广泛应用于服务器、桌面环境以及各种...
根据提供的文件信息,我们可以推断出这是一份关于Linux编程学习笔记的PDF资料。下面将对这份资料可能涉及的关键知识点进行详细的阐述。 ### Linux编程基础知识 #### 1. Linux操作系统概述 - **定义与特点**:Linux...
系统信息与系统资源-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
文件属性与目录-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
Framebuffer 是一种显示驱动接口,在 Linux 系统中用于抽象并屏蔽不同显示设备的硬件细节。它通过设备文件(如 /dev/fbX)提供一块显示内存,使应用程序无需关心物理显存的细节。应用程序通过 mmap 将显示缓冲区映射...
在嵌入式学习中,基于Linux操作系统的工作常常涉及到与文件系统、权限管理、程序开发以及I/O操作等紧密相关的知识。以下将详细讲解这些知识点: 首先,熟悉并掌握Shell指令是进行Linux操作的基础。在提供的内容中,...
《高级Linux环境编程》或称为APUE(Advanced Programming in the UNIX ...这本书不仅涵盖了UNIX编程的核心概念,还包括了许多实用的编程技巧和解决方案,是一本非常适合在Linux环境下从事系统编程学习的参考书籍。
Linux编程笔记,Linux开发必备,学习资料
《LinuxUNIX系统编程手册》是一本专为初学者设计的权威指南,涵盖了Linux和UNIX操作系统中的核心编程概念和技术。这本手册深入浅出地讲解了如何在这些类UNIX环境中进行系统级编程,包括与内核交互、管理进程、处理...
网络管理是Linux系统的另一个亮点,这部分的学习笔记涉及网络的基础知识,如IP地址、域名、路由、网关、端口、网卡等概念。网络命令的使用,如测试网络连通性的命令,以及显示和配置网络信息的命令,都是网络管理中...
线程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板