分类: LINUX
2012-03-02 10:11:30
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/O:fgets与fputs
函数原型:
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/O:fread 与 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/O:fprintf与fscanf
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) 。
文件
在 Linux 系统中, errno 定义在头文件 /usr/include/sys/errno.h ,多达 120 多条。
POSIX 定义 errno 为: extern int errno;
对于 errno 应当知道两条规则 :
1 :如果没有出错,则其值不会被一个例程清除。因此,仅当函数的返回值指明 出错时,才检验其值。
2 :任一函数都不会将 errno 值设置为 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