linux——基础IO常用接口或函数

C语言阶段(3)

打开流

FILE *fopen(const char *path, const char *mode);
 头文件:
#include <stdio.h>
 描述
函数 fopen 打开文件名为 path 指向的字符串的文件,将一个流与它关联。

   参数 mode 指向一个字符串,以下列序列之一开始 (序列之后可以有附加的字符):

   r      打开文本文件,用于读。流被定位于文件的开始。

   r+     打开文本文件,用于读写。流被定位于文件的开始。

   w      将文件长度截断为零,或者创建文本文件,用于写。流被定位于文件的开始。

   w+     打开文件,用于读写。如果文件不存在就创建它,否则将截断它。流被定位于文件的开始。

   a      打开文件,用于追加 (在文件尾写)。如果文件不存在就创建它。流被定位于文件的末尾。

   a+     打开文件,用于追加 (在文件尾写)。如果文件不存在就创建它。读文件的初始位置是文件的开始,但是输出总是被追加到文件的末尾。

字符串 mode 也可以包含字母 ``b’’ 作为最后一个字符,或者插入到上面提到的任何双字符的字符串的两个字符中间。

以追加方式打开文件 (以 a 作为 mode 的第一个字符) 将使得所有后续的对这个流的写操作发生在文件末尾,就好像在写之前调用了fseek(stream,0,SEEK_END); 一样。

 返回值
如果成功执行了 fopen, fdopen 和 freopen 将返回一个指向文件对象 FILE 的指针。否则,将返回 NULL 并将设置全局变量 errno 的值来指示错误发生。
函数 fopen 也有可能失败并置 errno 为 open(2) 指定的值。

二进制读

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
 头文件:
#include <stdio.h>
 描述
函数fread()从由流指向的流中读取nmemb数据元素,每个大小字节长,并将它们存储在ptr给出的位置。
 返回值
如果成功,fread()和fwrite()返回读取或写入的项的数量。此数字等于仅当大小为1时传输的字节数。如果发生错误,或者到达文件末尾,返回值是一个短项计数(或0)
fread()不区分文件结束和错误,调用者必须使用feof(3)和ferror(3)来确定哪个发生了。

二进制写

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
 头文件:
#include <stdio.h>
 描述
函数fwrite()将数据的nmemb元素(每个大小字节长)写入流所指向的流,从ptr给出的位置获取它们。
 返回值
如果成功,fread()和fwrite()返回读取或写入的项的数量。此数字等于仅当大小为1时传输的字节数。如果发生错误,或者到达文件末尾,返回值是一个短项计数(或0)

重新定位一个流

int fseek(FILE *stream, long offset, int whence);
 头文件:
#include <stdio.h>
 描述
描述函数的作用是:为流所指向的流设置文件位置指示器。新位置(以字节度量)是通过向指定位置添加偏移字节来获得的如果从何处开始寻找归宿,查找当前,或查找结束,偏移量分别相对于文件的开始、当前位置指示器或文件结束。对fseek()函数的成功调用将清除流的文件结束指示器,并取消ungetc(3)函数对同一流的任何影响。
 返回值
成功完成后fseek()返回0,否则,将返回-1并设置errno以指示错误。

关闭流

int fclose(FILE *stream);
 头文件:
#include <stdio.h>
 描述
函数 fclose 将名为 stream 的流与它底层关联的文件或功能集合断开。如果流曾用作输出,任何缓冲的数据都将首先被写入,使用 fflush(3)
 返回值
成功执行返回 0,否则返回 EOF 并设置全局变量 errno 来指示错误发生。任何一种情况下,对流再进行存取 (包括再次调用 fclose())都会带来未定义的结果。

标题系统调用的文件流(2)

打开文件

int open(const char *pathname, int flags, mode_t mode);
 头文件
#includ e <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
 描述
pathname :要打开文件的路径+文件名称
flags :以何种方式打开
参数flags是通过O_RDONLY,O_WRONLY或O_RDWR(指明文件是以只读,只写或读写方式打开的)与下面的零个或多个可选模式按位-or操作得到的:
O_CREAT
若文件不存在将创建一个新文件.新文件的属主(用户ID)被设置为此程序的有效用户的ID.同样文件所属分组也被设置为此程序的有效分组的ID或者上层目录的分组ID(这依赖文件系统类型,装载选项和上层目录的模式,参考,在mount(8)中描述的ext2文件系统的装载选项bsdgroups和sysvgroups)
O_TRUNC
假如文件已经存在,且是一个普通文件,打开模式又是可写(即文件是用O_RDWR或O_WRONLY模式打开的),就把文件的长度设置为零,丢弃其中的现有内容.若文件是一个FIFO或终端设备文件,O_TRUNC标志被忽略.其他O_TRUNC的作用是不具体指定的(在许多Linux版本中,通常会被忽略,其他的一些版本将返回一个错误)
O_APPEND
文件以追加模式打开.在写以前,文件读写指针被置在文件的末尾.
mode :对于新创建的文件,设置文件权限
 返回值
open和creat都返回一个新的文件描述符(若是有错误发生返回-1,并在errno设置错误信息)

写文件描述符

ssize_t write(int fd, const void *buf, size_t count);
 头文件
#include <unistd.h>
 描述
fd :文件描述符
buf :写什么数据
count :写入数据的大小
write向文件描述符fd所引用的文件中写入从buf开始的缓冲区中count字节的数据.POSIX规定,当使用了write()之后再使用read(),那么读取到的应该是更新后的数据。
 返回值
成功时返回所写入的字节数(若为零则表示没有写入数据).错误时返回-1,并置errno为相应值.
若count为零,对于普通文件无任何影响,但对特殊文件 将产生不可预料的后果.

读文件描述符

ssize_t read(int fd, void *buf, size_t count);
 头文件
#include <unistd.h>
 描述
fd:文件描述符
buf:数据存储的空间,读到的数据存在哪里去
count:最大读多少,一般都是指的是buf空间大小减1
read()从文件描述符fd中读取count字节的数据并放入从buf开始的缓冲区中.
如果count为零,read()返回0,不执行其他任何操作.如果count大于SSIZE_MAX,那么结果将不可预料.
 返回值
成功时返回读取到的字节数(为零表示读到文件描述符),此返回值受文件剩余字节数限制.当返回值小于指定的字节数时并不意味着错误; 这可能是因为当前可读取的字节数小于指定的字节数(比如已经接近文件结尾,或者正在从管道或者终端读取数据,或者read()被信号中断).发生错误时返回-1,并置errno为相应值.在这种情况下无法得知文件偏移位置是否有变化.

重新定位读/写文件偏移量

off_t lseek(int fd, off_t offset, int whence);
 头文件
#include <sys/types.h>
#include <unistd.h>
 描述
fd:文件描述符
offset:偏移量
whence:偏移到哪里去
 返回值
成功完成后,Lseek()返回从文件开始以字节为单位测量的偏移位置。在出现错误时,返回值(off_t) -1,并设置errno来指示错误。

关闭文件描述符

int close(int fd);
 头文件
#include <unistd.h>
 描述
fd:文件描述符
 返回值
close返回0表示成功,或者-1表示有错误发生.


文件描述符

内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。

每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开。系统为每一个进程维护了一个文件描述符表,该表的值都是从0开始的,所以在不同的进程中你会看到相同的文件描述符,这种情况下相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

文件描述符与文件指针的区别

文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的非负整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。
文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值