(一)和菜鸟一起学习unix之文件I/O:write read lseek

时间:2023-01-12 19:23:33

man  2 read


NAME
       read - read from a file descriptor

SYNOPSIS
       #include <unistd.h>

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

         fd:参数是文件描述符所指向的文件

         buf:是你要读到指定的内存

        size_t:  你要读取文件多少字节

DESCRIPTION
       read()  attempts to read up to count bytes from file descriptor fd into
       the buffer starting at buf.

       If count is zero, read() returns zero and has  no  other  results.   If
       count is greater than SSIZE_MAX, the result is unspecified.
 返回值:或成功则返回读到的字节数,若已到文件的结尾则返回0,若出错则返回-1。


环境高级编程一书中总结的。现在我只能理解其中的几个

在多种情况下你读到字节数少与你要求的字节数:

读普通文件时,在你要求读的字节数之前到达了文件的结尾。例如你要读100字节,可文件只有10字节

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

从一些面向记录设备读时,一次最多返回一个记录。

当从网络读时,网络中的缓冲机构可能造成返回值小于要求读的字节数。

某个信号中段时,但已经读了一部分,一部分没读。

当从管道或FIFO读时管道包含的字节数少于所需要的字节数,那么read返回实际的字节数。

 练习以一个例子:

先让我们vim 编辑一个 read.txt文件 ,里面随便写几个字母,hello unix。

 1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<sys/stat.h>
  4 #include<fcntl.h>
  5 #include<unistd.h>
  6 #include<string.h>
  7 int main(void)
  8 {
  9     int fd;
 10     if((fd = open("read.txt",O_RDONLY)) < 0)
 11         perror("open file fial");
 12     else
 13     printf("open success\n");
 14
 15    char a[20];
 16      read(fd, a,sizeof(a));
 17      printf("%s\n",a);
 18     close(fd);
 19 }
 

 WRITE:写
 ssize_t write(int fd,void *buf,ssize_t count);
 write会把参数buf所指的内存写入count个字节到参数fd所指定的文件中。读写位置会随之移动
 返回值:顺利实际写入的字节数,当有错误发生时,返回-1,错误代码放在errno中

  1#include<stdio.h>
  2 #include<sys/types.h>
  3 #include<sys/stat.h>
  4 #include<fcntl.h>
  5 #include<unistd.h>
  6 #include<string.h>
  7 int main(void)
  8 {
  9     int fd;
 10     if((fd = open("read.txt",O_RDWR|O_APPEND)) < 0)
 11         perror("open file fial");
 12     else
 13         printf("open success\n");
 14
 15    char a[] ="1234" ;
 16     if (write(fd, a,sizeof(a))>0 );
 17     printf("write ok");
 18     close(fd);
 19 }

 


 
LSEEK:定位
 每个打开的文件都有一个与其相关联的“当前文件偏移量”,他是一个非负整数,用以度量从文件开始处计算的字节数。通常,读写操作都从当前文件偏移量处开始,并使偏移量增加所读或所写的字节数。按系统默认,打开一个文件的时候,除非指定O_APPEND选项,否则该位移量都为0.
 #include <sys/types.h>
 #include <unistd.h>
 off_t lseek(int fd,off_t offset,int whence);
功能:设置文件内容读写位置
返回:若成功为新的文件位移,若出错为-1
whence:
 SEEK_SET
 SEEK_CUR
 SEEK_END例子:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
 int fd=open("read.txt",O_RDWR|O_TRUNC);
 write(fd,"abcdef",6);
 lseek(fd,-4,SEEK_CUR);
 write(fd,"h",1);
 lseek(fd,0,SEEK_SET);
 char s[20]={0};
 int i,len;
 len=read(fd,s,20);
 for(i=0;i<20;i++)
  printf("%c",s[i]);
 printf("\n%s\n%d",s,len);
 close(fd);
}