Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1235435
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: LINUX

2012-03-02 10:11:30

文件结构体 FILE

a. 缓冲文件系统为每个正使用的文件在内存开辟文件信息区

b. 文件信息用系统定义的名为 FILE 的结构体描述

c. FILE 定义在 stdio.h

typedef   struct

{   int   _fd;            // 文件号

   int   _cleft;        // 缓冲区中剩下的字符数

int   _mode;   // 文件操作方式

            char  *_next;  // 文件当前读写位置

        char  *_buff;       // 文件缓冲区位置

}FILE;

 

指针变量说明:     FILE   *fp;

用法:

  文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息 , 访问文件

     文件关闭后,它的文件结构体被释放

 

C 文件操作用库函数实现 , 包含在 stdio.h

文件使用方式 : 打开文件 --> 文件读 / --> 关闭文件

系统自动打开和关闭三个标准文件:

 标准输入 ------ 键盘                 stdin

 标准输出 ------ 显示器             stdout

 标准出错输出 ----- 显示器      stderr

 

1. 打开文件 fopen

a. 函数原型:   FILE    *fopen(char  *name,char *mode)

功能:按指定方式打开文件

返值:正常打开,为指向文件结构体的指针;打开失败,NULL

文件使用方式:

r/rb”(只读):为输入打开一个文本/二进制文件

w/wb”(只写):为输出打开或建立一个文本/二进制文件

a/ab”(追加):文本/二进制文件尾追加数据

r+/rb+”(读写):为读/写打开/二进制文件

w+/wb+”(读写):为读/写建立一个文本/二进制文件

a+/ab+”(读写):为读/写建立或打开一个文本/二进制文件

例:

FILE *FP;

 Fp=fopne(“aa.c”,”w”);

 If(fp==NULL)

{     printf(“File open error!\n”);

       Exit(0)

 

2. 文件关闭 fclose

a. 作用 : 使文件指针变量与文件脱钩,释放文件结构体和文件指针

b. 函数原型: int  fclose(FILE  *fp)

功能:关闭 fp 指向的文件

返值:正常关闭为 0; 出错时,0

3字符 I/O:fputc fgetc

fputc

 函数原型: int  fputc(int c, FILE *fp)

功能:把一字节代码 c 写入 fp 指向的文件中(会将参数C转化为unsigned char 后写入参数stream指定文件中)

 返值:正常,返回 c; 出错,为 EOF

fgetc

函数原型: int  fgetc(FILE *fp)

功能:从 fp 指向的文件中读取一字节代码

返值:正常,返回读到的代码值 ; 读到文件尾或出错,为EOF

文件 I/O 与终端 I/O

#define     putc(ch,fp)       fputc(ch,fp)

#define     getc(fp)            fgetc(fp)

#define     putchar( c )      fputc(c,stdout)

 

4.字符串I/Ofgetsfputs

函数原型:

char  *fgets(char  *s,int n,FILE  *fp)

int   fputs(char  *s,FILE  *fp)

功能:从 fp 指向的文件读 / 写一个字符串

返值:fgets 正常时返回读取字符串的首地址;出错或文件尾,返回NULL

fputs 正常时返回写入的最后一个字符;出错为 EOF

 

低级IO映射到高级文件IO

FILE * fdopen(int FD, const char * MODE)

功能:将一已打开的文件描述符关联到文件流。

返回:成功返回文件指针,失败返回 NULL

参数: FD 已打开的文件描述符 ( 如用 open 打开的文件 ), MODE 为打开模式 ( fopen)

   数据块I/Ofread fwrite

size_t  fwrite(void  *buffer,size_t  size, size_t  count,FILE   *fp)

功能:读 / 写数据块

返值:成功,返回读 / 写的块数;出错或文件尾,返回 0

说明:

typedef   unsigned   size_t;

buffer:       指向要输入 / 输出数据块的首地址的指针

size:   每个要读 / 写的数据块的大小(字节数)

count:    要读 / 写的数据块的个数

fp:          要读 / 写的文件指针

fread fwrite  一般用于二进制文件的输入 / 输出

格式化I/Ofprintffscanf

int  fprintf(FILE  *fp,const char  *format[,argument,…])

int  fscanf(FILE  *fp,const char  *format[,address,…])

功能:按格式对文件进行 I/O 操作

返值:成功, 返回 I/O 的个数; 出错或文件尾, 返回 EOF

fprintf(fp,“%d,%6.2f”,i,t);     // i t %d,%6.2f 格式输出到 fp 文件

fscanf(fp,“%d,%f”,&i,&t);    // 若文件中有 3,4.5 , 则将 3 送入 i, 4.5 送入t

 

文件定位

a.文件位置指针 ----- 指向当前读写位置的指针

b.读写方式

 顺序读写:位置指针按字节位置顺序移动

 随机读写:位置指针按需要移动到任意位置

rewind 函数

函数原型:   void  rewind(FILE  *fp)

功能:重置文件位置指针到文件开头

返值:无

ftell 函数

函数原型:   long  ftell(FILE  *fp)

功能:返回位置指针当前位置 ( 用相对文件开头的位移量表示 )

返值:成功,返回当前位置指针位置;失败,返回 -1L

fseek 函数

函数原型:   int  fseek(FILE  *fp,long  offset,int whence)

功能:改变文件位置指针的位置

 

出错的检测

ferror 函数

函数原型:      int  ferror(FILE  *fp)

功能:测试文件是否出现错误

返值:未出错,0 ;出错,非 0

说明:每次调用文件输入输出函数,均产生一个新的 ferror 函数值,所以应及时测试

fopen 打开文件时,ferror 函数初值自动置为0

clearerr 函数

函数原型:void  clearerr(FILE  *fp)

功能:使文件错误标志置为 0

返值:无

说明:出错后,错误标志一直保留,直到对同一文件调clearerr(fp) rewind 或任何其它一个输入输出函数

 

Linux系统调用与文件I/O

Linux 系统调用:

所谓系统调用是指操作系统提供给用户程序的一组特殊接口,用户程序可以通过这组特殊接口来获得操作系统内核提供的特殊服务。在 Linux 中用户程序不能直接访问内核提供的服务。为了更好的保护内核空间,将程序的运行空间分为内核空间和用户空间,他们运行在不同的级别上,在逻辑上是相互隔离的。

Linux 中用户编程接口( API )遵循了在 UNIX 中最流行的应用编程界面标准— POSIX 标准。这些系统调用编程接口主要通过 C 库( libc )实现的。

 

基础文件I/O介绍

可用的文件 I / O 函数——打开文件、读文件、写文件等等。大多数 Linux 文件 I / O 只需用到 5 个函数:open read write lseek  以及 close

不带缓存指的是每个 read write 都调用内核中的一个系统调用。这些不带缓存的 I / O 函数不是 ANSI C 的组成部分,而是POSIX(Portable Operating System Interface of Unix UNIX 型可移植操作系统接口 ) 组成部分。

 

文件描述符

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

POSIX.1 应用程序中,整数 0 1 2 应被代换成符号常数:

1.   STDIN_FILENO

2.   STDOUT_FILENO

3.   STDERR_FILENO

这些常数都定义在头文件  中。

文件描述符的范围是 0 ~ OPEN_MAX   。早期的 UNIX 版本采用的上限值是 1 9 ( 允许每个进程打开 2 0 个文件 ) ,现在很多系统则将其增加至256

 

原始系统数据类型

UNIX/Linux 的开发过程中用到的以 _t 结尾的数据为系统原始数据。

系统原始数据在头文件 中被定义。


出错处理

Linux 函数出错时,往常返回一个负值,而且整型变量 errno 通常设置为具有特定信息的一个值。例如, open 函数如成功执行则返回一个非负文件描述符,如出错则返回 -1

open 出错时,有大约 1 5 种不同的 errno 值。

1. 某些函数并不返回负值而是使用另一种约定。例如,返回一个指向对象的指针的大多数函数,在出错时,将返回一个 null 指针 (NULL)

文件 中定义了变量 errno 以及可以赋与它的各种常数。这些常数都以 E 开头。

Linux 系统中, errno 定义在头文件 /usr/include/sys/errno.h ,多达 120 多条。

POSIX 定义 errno 为: extern int errno;

对于 errno 应当知道两条规则 :

             1 :如果没有出错,则其值不会被一个例程清除。因此,仅当函数的返回值指明 出错时,才检验其值。

             2 :任一函数都不会将 errno 值设置为 0 ,在 中定义的所有常数都不为0

 

错误处理的标准函数

strerror ()

             1. 功能:以字符串方式打印错误信息。

             2 . 用法:

                    #include

char *strerror(int errnum);

3.返回:指向消息字符串的指针。

perror ()

      1. 功能:在标准错误上产生一条基于其参数串和 errno 的当前值出错消息。

      2 . 用法:

                    #include

                    void perror(const char * msg);

      3.输出:首先输出由 msg 指向的字符串,然后是一个冒号,一个空格,然后是对应于errno 值的出错信息,然后是一个新行符。

 

处理错误的示例

#include

#include

int main(int argc, char *argv [ ])

{

      fprintf(stderr, " E ACCE S=% d: % s \n" ,E A CCE S , strerror(E A CCE S ));

      errno =ENOEN T;

      perror(argv [0 ]);

      return 0;

}

结果 :假设, 编译 后生成 a.out 则输出为:

E ACCE S=1 3 P ermission denied

./a.out: No such file or director y


阅读(2093) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~