linux中文件I/O操作(系统I/O)

用到的文件I/O函数有以下几个:打开文件、读文件、写文件、关闭文件等
对应用到的函数有:open、read、write、close、lseek(文件指针偏移)



文件描述符:对于内核而言,所有打开的文件都通过文件按描述符引用。文件描述符是一个非负整数。
当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
当读、写一个文件时,使用open/creat返回的文件描述符标识该文件,将其作为参数传送给read或write。


linux系统下文件描述符0是标准输入,1是标准输出,2是标准出错,所以一般打开文件的时候文件描述符都是从3开始。


一、打开文件
 (1)头文件
       #include <sys/types.h>
       #include <sys/stat.h>

       #include <fcntl.h>

 (2)函数原型    int open(const char *pathname, int flags);

      参数:


 a、pathname:打开或者创建的文件名字,如"text"
 
 b、 flags:
          O_RDONLY:只读打开
         O_WRONLY:只写打开
         O_RDWR:读、写打开
         O_CREAT:若此文件不存在则创建它,使用O_CREAT时后面要跟文件的访问权限位,如O_CREAT,0777
         O_APPEND:每次写时都追加到文件的尾端
         O_EXCL :如果同时指定了O_CREAT,而文件已经存在,则出错,用此可以测试一个文件是否
                              存在,如果不存在,则创建此文件,这使测试和创建两者成为一个原子操作
         O_DSYNC:使每次write等待物理I/O操作完成,但是如果该写操作并不影响读取刚写入的
                                 数据,则不需等待文件属性被更新
         O_NONBLOCK :如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则
                                           此选项为文件的本次打开操作和后续的I/O操作设置非阻塞方式
         O_NOCTTY:如果path引用的是  终端设备,则将该设备分配为此进程的控制终端
         O_SYNC:使每次write要等待物理I/O操作完成,包括有该write引起的文件属性更新所需的I/O
         O_TRUNC:如果文件存在,并且是常规文件而且以读写或者只写打开,则将其长度截断为0,
                                  如果文件是FIFO或终端设备文件,O_TRUNC标志被忽略,否则O_TRUNC不明确
         O_DIRECTORY:如果pathname引用的不是目录,则出错


(3)返回值:
     成功:文件描述符
     失败:-1  

二、读取文件

(1)头文件  #include <unistd.h>


(2)函数原型   ssize_t   read(int fd, void *buf, size_t count);
     参数:
         a、fd:调用open后返回的文件描述符
         b、buf:用来存放从文件中读到的数据的缓冲区
         c、count:读取的字节数
 
(3)返回值:
            成功:读到的字节数,如果读到文件尾端,则返回0
            失败:-1
 
三、写数据

(1)头文件 #include <unistd.h>


(2)函数原型   ssize_t  write(int fd, const void *buf, size_t count);
          参数:
           a、fd:调用open后返回的文件描述符
           b、buf:从来存放数据的缓冲区
           c、count:写入数据的字节数


(3)返回值:
            成功:返回已写的字节数
            失败:-1
 
四、关闭文件
(1)头文件  #include <unistd.h>


(2)函数原型  int   close(int fd);
             参数:
               a、fd:调用open后返回的文件描述符


  
五、文件偏移
 (1)头文件  #include <sys/types.h>
              #include <unistd.h>

 (2)函数原型   off_t  lseek(int fd, off_t offset, int whence);
               参数:
               a、fd:调用open后返回的文件描述符
               b、offset  和参数whence有关,通常设置为0 (according  to  thedirective whence as follows)
               c、whence:
                         SEEK_SET: 将文件的偏移量设置为距文件开始处offset个字节
                         SEEK_CUR:将文件的偏移量设置为其当前值加offset个字节,offset可为正或负
                         SEEK_END: 将文件的偏移量设置为文件长度加offset,offset可为正或负
 
(3)返回值:
     成功:返回新的文件偏移量

     失败:-1


下面是代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define PATHNAME "text.txt"
#define LENGTH 4096

void error(char *name) //错误提示
{
	perror(name);
	exit(1);
}

int main(int argc,char *argv[])
{
	
	int fd ; //存放文件描述符
	int size1; //读操作时的返回值
	int size; //写操作时的返回值
	int offset; //文件偏移量
		
    //打开文件
	/*O_REWR表示已读写权限打开文件,O_CREAT表示如果文件不存在则创建
	*创建的新文件的权限为0777,即是可读可写可执行,O_APPEND表示
    *写入数据时从文件尾端写入*/
    if((fd = open(PATHNAME,O_RDWR|O_CREAT|O_APPEND,0777)) == -1)  	 
	{
		error("open");
	}		
	
	
    char buf[LENGTH];
	bzero(buf,sizeof(buf));
    
	//从文件中读取数据
    if((size1 = read(fd,buf,sizeof(buf))) == -1)
	{
		error("read");
	}
	
	printf("%s\n",buf);
  
  
   char buf1[LENGTH] = "小世界";
   //写入数据到文件中
   if((size = write(fd,buf1,sizeof(buf))) == -1)
   {
	   error("write");
   }

	char buf3[LENGTH] = "hello world";
	if((size = write(fd,buf3,sizeof(buf3))) == -1)
	{
		error("write");
	}
	
	//因为写入数据到文件中的时候已经把文件指针偏移到文件尾端了,所以要重新把文件指针偏移到文件头,方便下面的读操作
	if((offset = lseek(fd,0,SEEK_SET)) == -1)
	{
		error("lseek");
	}
	
	bzero(buf,sizeof(buf));
    if((size1 = read(fd,buf,sizeof(buf))) == -1)
	{
		error("read");
	}
	printf("%s\n",buf);
	
	//关闭文件
	close(fd);
	return 0;
}





这是我在ubuntu下运行的结果,有个很奇怪的地方就是我在windows下打开文件的时候并没有看到后面写进去的内容,但是在ubuntu下用cat命令却能看到全部写进去的内容,而且终端中输出也看不到,不知道有哪位大神知道这个该怎么弄


用cat命令打开文件:

   


终端输出:





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值