unix环境高级编程复习-文件I/O(2)

来源:互联网 发布:kendalltau python 编辑:程序博客网 时间:2024/05/19 03:27

当前文件偏移量:

      我们都知道文件是连续的,就像我们经常看到的txt文件,它是由一串连续的字符构成的。我们对txt的操作希望是对其中字符的操作,我们如何知道现在操作的是那个字符和如何操作确定的字符哪?这时候我们就需要文件偏移量来帮助我们了。每个打开的文件都有一个与其相关的“当前文件偏移量”。它通常是一个非负数(有可能不是),用以度量从文件开始处计算的的字节数。通常读,写操作都是从当前文件偏移量处开始的,并使偏移量增加所读写的字节数。按系统默认情况,当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置为0。

我们可以显式地为一个打开的文件设置其偏移量。

          #include<unistd.h>

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

                                       返回值:若成功返回新的文件偏移量,否则返回-1。

参数offset的解释与惨数whence的值有关。

微笑若whence是SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节。

微笑若whence是SEEK_CUR,则将该文件的偏移量设置为其当前之加offset,offset可为正或负。

微笑若whence是SEEK_END,则将文件的偏移量设置为文件长度加offset,offset可为正或负。

read函数(从文件中读数据):

        #include<unistd.h>

        ssize_t  read(int fileds,void *buf,size_t  nbyte);

                                       返回值:若成功则返回读到的字节数,若已到文件尾则返回0,若出错则返回-1。

有多种情况可使读到的字节数少于要求读的字节数:

微笑读普通文件时,在读到要求的字节数之前已到文件尾。

微笑当从终端设备读时,通常最多一次最多读一行。

微笑当一信号造成中断,而已经读了部分数据。

write函数(向文件中写数据):

     #include<unistd.h>

     ssize_t  write(int fileds,const void *buf,size_t  nblyte);

                                返回值:若成功则返回已写的字节数,若出错则返回-1。


例子:将标准输入复制到标准输出


#include<unistd.h>

#include<stdio.h>

#define BUFFSIZE   4096

int main()

{

         int n;

        char buf{BUFFSIZE];

       while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0)

                if(write(STDOUT_FILENO,buf,n)!=n)

                        printf("write error");

     if(n<0)

        printf("read error");

     exit(0);

}

0 0
原创粉丝点击