嵌入式开发14天(文件IO,空洞文件的生成)

=========================文件IO=====================

1、open 打开一个指定的文件,或者是创建一个文件

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>


       int open(const char *pathname, int flags);   //O_RDONLY | O_APPEND
       int open(const char *pathname, int flags, mode_t mode);


返回值 成功:返回文件描述符(大于2整数)
失败:-1


const char *pathname:文件路径
int      flags:
  O_RDONLY  :只读
  O_WRONLY  :只写
  O_RDWR    :可读可写
  O_APPEND  : 以追加方式打开文件,文件指针设置在文件尾
  O_CREAT   :如果文件不存在,则创建  //用于第二个open
  O_EXCL    :如果使用O_CREAT选项且文件存在,则返回错误消息。
  O_NOCTTY  :如果文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端


调用后要记得close();


 mode = mode & ~umask
 777
0777 & ~0002                            1101
0777 &  FFFD = 07750111
                                   ------------
0101

2、关闭文件

       #include <unistd.h>


       int close(int fd);  //fd



返回值: 成功:0
失败:-1
int fd:文件描述符     例如:fd=open("/xx/xx",O_RDONLY);


3、read 从指定目录中读取数据



       #include <unistd.h>


       ssize_t read(int fd, void *buf, size_t count);
  ssize_t:-->int 


返回值: 成功:读到的实际字节数

失败:-1;

读完:返回0



int fd:文件描述符
void *buf:数据缓冲区地址
size_t count:想要从fd中读取的字节数




4、write 将数据写入指定的文件

      #include <unistd.h>


      ssize_t write(int fd, const void *buf, size_t count);


返回值: 成功:定入的字节数
失败:-1

int fd:文件描述符
const void *buf:指向写入数据的地址
size_t count:写入的字节数

写某个文件需要先 open打开 并且授权 0766 之类的



练习:在一个file的文件里面有一段数据HelloWorld,请将HelloWorld从文件中读出来,并写到file2。


思考题,往一个文件中写一段指定的数据,然后将数据读出来,结果会怎么样




5、lseek 文件指针偏移



       #include <sys/types.h>
       #include <unistd.h>


       off_t lseek(int fd, off_t offset, int whence);


返回值   成功:文件指针偏移量(从指向地址到,文件指针指定结束的地址,文件指针偏移的字节)
失败:-1;


int fd:文件描述符
off_t offset:新位置偏移量的基准点的偏移(可正,可负,也可0)
int whence:文件偏移起始位置


SEEK_SET: 文件开头
SEEK_CUR:  文件当前位置
SEEK_END:  文件尾


文件指针指向的位置 = whence+offset


1、帐号与密码登录操作(帐号与密码在文件/home/gec/ps)文件里有usrname:xxxx  passwd:xxxxx
   然后写一个程序实现输入帐号与密码,如果匹配成功,则提示成功,如果三次匹配失败,退出程序




练习:
采用系统IO实现shell的cp命令(用两个方法去实现)
cp xxx xxx1(xxx源文件,xxx1是目标文件)
./xxx  xxx xxx1(xxx源文件,xxx1是目标文件)



利用lseek()开生成空洞文件

1:空洞文件是什么?

看看迅雷下载的文件,在未下载完成时就已经占据了全部文件大小的空间,这时候就是空洞文件。下载时如果没有空洞文件,多线程下载时文件就都只能从一个地方写入,这就不是多线程了。如果有了空洞文件,可以从不同的地址写入,就完成了多线程的优势任务。
在开发过程中有时候需要为某个文件快速地分配固定大小的磁盘空间
(1)可以让文件尽可能的占用连续的磁盘扇区,减少后续写入和读取文件时的磁盘寻道开销;
(2)迅速占用磁盘空间,防止使用过程中所需空间不足。
(3)后面再追加数据的话,不会需要改变文件大小,所以后面将不涉及metadata的修改。
            ---出至不明网友


空洞文件可以理解为,老妈一大早就去占位置,怕别人拼桌还喊了老爸去,一人坐头位,一人坐尾巴~

作用,提前得到了足够的位置,没人抢。

怎么实现?


/*使用lseek函数构建空洞文件*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main(void)
{
  int fd = -1,i;
  int size = -1;
  int offset = -1; 
  /*存放数据的缓冲区*/
  char buf1[]="the start";
  char buf2[]="the end";
  /*文件名*/
  char filename[] = "hole.txt"; 
  int len = 8;
  
  /*创建文件hole.txt*/
    fd = open(filename,O_RDWR|O_CREAT,766);
    if(-== fd){
        /*创建文件失败*/
     return -1;
    }    

    /*将buf1中的数据写入到文件Hole.txt中*/
    size = write(fd, buf1,len);
    if(size != len){
        /*写入数据失败*/
        return -1;    
    }
    
    /*设置文件偏移量为绝对值的32*/
    offset = lseek(fd, 32, SEEK_SET);
    if(-== offset){
        /*设置失败*/
        return -1;
    }
    /*将buf2中的数据写入到文件hole.txt中*/
    size = write(fd, buf2,len);
    if(size != len){
        /*写入数据失败*/
        return -1;    
    }
        
    /*关闭文件*/
    close(fd);

    return 0;
}

结果为:
  t   h   e       s   t   a   r  \0  \0  \0  \0  \0  \0  \0  \0
 \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
  t   h   e       e   n   d  \0




























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

交叉编译之王 hahaha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值