linux嵌入式文件IO操作
IO操作
io操作是指的是指的用户在应用端调用内核的函数从而进行文件操作,
有直接调用内核的文件IO接口如open (),read() ,write(),lseek()等。
还有c语言库里面也有库函数可以操作,我们一般称其为标准IO与之对应的是标准IO的库函数fgets(),fputs(),flseek(),rewin().等等。通过不同的操作方式可以做到不同的效果
文件IO
文件IO是linux内核直接提供给应用层的接口函数 包涵的头文件有
一.打开函数 open()
在linux内核中有这一局一切皆文件的说法。而每个文件都有它相应的文件标识符,简单来说文件标识符就是和我们的的名字一样,用于后面读写操作的标识符。
大家可以用ls - lai来查看linux下的文件id
open()函数:打开或创建一个文件,有三个参数,成功返回返回一个int 类型的数字充当文件标识符,打开失败返回负值。
open(char*,flag,mode)
@char*表示的是打开或创建的文件路径,如果在当前目录下有文件,直接输入文件名即可
@flag表示 打开方式:
O_RDONLY//只读模式(用户只能读文件)
O_WRONLY//(用户只能往文件里写内容)
O_RDWR//读写模式(用户可以对文件写操作或者读操作
---------------------------------------------------------------------
打开的限制条件:
O_CREAT //如果不存在就创建
O_EXCL //查询是否有重复(有则,不会创建
O_TRUNL//打开并且删除文件类里原有的文件
O_APPEND//已追加的方式去打开文件(保留文件原有内容偏移指针在最后)
@mode:模式的选择以二进制的方式来指定这个文件的打开方式,一般是设定值与系统自带umask掩码异同之后。一般设置0777,全部权限。当然可供自己需求方式来规范处理
例子:打开一个当前目录下为test.c的文件,权限为读写,如果没有则创建
int fd;
fd=open("test.c",O_CREAT||O_RDWR,0777);
if(!fd)
{
printf("the open is fail");
return -1;
}
二.读函数 read()三个参数 用户调用内核接口来对文件作出读的操作 成功返回实际读到的字节,失败返回负值。
read(int fd,char*buf,sizeof(buf))
@fd :由open函数的文件标识符 表示从那个文件里读(读哪里);
@char *buf :将独到的内容放在一个自定义的缓存数组里,方便之后操作(读到哪);
@ sizeof(buf):调用一次read函数读多少 (读多少);
例子
int fd;
nt read_size;
char read_buf [100] = {0};
//打开文件
fd=open("test.c",O_CREAT||O_RDWR,0777);
if(!fd)
{
printf("the open is fail\n");
return -1;
}
读文件
read_size = read(fd,read_buf,sizeof(read_buf));
if(!read_size)
{
printf("read is fail\n");
}
三.写函数write()三个参数用户调用内核接口函数从而实现对文件的写操作,成功返回实际写入的字节数 失败返回负值。
write(fd,char* buf,sizeof(buf));
@fd:由open函数得到的文件标识符(写哪里)
@char* buf 你需要写入什么东西以字符串方式写入(写什么)
@sizeof(buf)你写入东西有多少 (写多少)
int fd;
int read_size;
char read_buf [100] = {0};
char write_buf[100]={"i love you"};
int write_size;
//打开文件
fd=open("test.c",O_CREAT||O_RDWR,0777);
if(!fd)
{
printf("the open is fail\n");
return -1;
}
读文件
read_size = read(fd,read_buf,sizeof(read_buf));
if(!read_size)
{
printf("read is fail\n");
}
```write_size = write(fd,write_buf,sizeof(write_buf));
if(!write_size)
{
printf("write if fail\n");
}
//而这个函数写下去后编译后会写的东西无法读到,
或者读的东西无法写写到这个是是因为在程序里会有文件位置指针这个说法,
当你写入之后指针在文件末尾,直接使用读函数自然读不了东西怎么解决继续看~
``
四。文件定位函数lseek()三个参数用于调整位置指针的函数使用UNIX系统调用来读取文件内容时,系统究竟是从文件的哪一个位置读取数据,完全由文件指针决定。例如:刚开始读取数据时,文件指针通常是指向文件的起始位置。没有返回值
lseek(fd,偏移量,偏移基准);
@fd:由open函数所得到的文件标识符
@偏移量:和第三个参数联合起来理解,表示从文件记得基准位置偏移,正数负数表示左右
@偏移起始位置:由文件哪里开始偏移,和回到那里
SEEK_SET->文件开头加上偏移量的位子
SEEK_CUR->文件当时的位子加上偏移量
SEEK_END->文件末尾加上偏移量
例子:
lseek(fd,0,SEEK_SET);//表示回到文件的开头
小程序:复制Linux下的cp指令来通过硬盘输入2文件名将后方文件中内容复制到前方
小程序linxu中文件复制-CP命令的实现:
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int main(int argc, const char *argv[])
{
char buf[10]={"hello ypf"};
int buf_size;
buf_size = sizeof(buf);
int fd1,fd2;
int write_size;
int read_size;
char buf_read[1]={0};
int buf_size_read;
buf_size_read = sizeof(buf_read);
fd1= open(argv[1],O_CREAT|O_RDWR,0777);
if (!fd1)
{
printf("the file1 open flid\n"); /* code */
}
else printf("the file open succeed the fd : %d\n",fd1);
fd2 = open(argv[2],O_CREAT|O_RDWR,0777);
if(!fd2)
{
printf("the file2 open falid \n ");
}else printf("the flie2 open succeed the fd2:%d\n",fd2);
while(read_size)
{ read_size = read(fd2,buf_read,buf_size_read);
/* if(!read_size)
{
printf("the read is falid\n\n");
}
*/
write (fd1,buf_read,buf_size_read);
/* if(!write_size)
{
printf("the write is falid\n" );
}*/
}
return 0;
}
感谢查看,如有不妥之处欢迎给我留言
QQ:1339781385
邮箱如上