Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22960
  • 博文数量: 14
  • 博客积分: 560
  • 博客等级: 中士
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-21 20:25
文章分类

全部博文(14)

文章存档

2010年(14)

我的朋友
最近访客

分类: C/C++

2010-10-14 20:01:39

CI/O操作和数据格式化函数(一)

 

磁盘的任何文件的内容是字节序列。内存也是字节序列  

如果以"文本"方式打开一个文件,那么在读字符的时候,系统会把所有的"\r\n"序列转成"\n",在写入时把"\n"转成"\r\n"  

按文本方式往文件的读写Buffer中写入数据时,一旦遇到换行字符’\n’(ASCII值为0x0a),则会先转换为回车换行’\r\n’(即连续的ASCII0x0d0x0a),再写入文件。在读取文件到文件的读写Buffer时,一旦遇到回车换行的组合(即连续的ASCII0x0d0x0a),则会先转换为换行字符(ASCII值为0x0a),在写到用户指定的缓冲区中。
       而以二进制方式打开文件时,读写则不做这样的转换。
  注:只对Windows系统有效,unix/linux系统就不做这样的转换。

 

输入设备输入向内存的数据也是字节序列,输出设备读取的内存数据也是字节序列

各种数据类型是占据内存的一定数目的字节序列

 

数据解释(转换)是一个字节序列 变成 另一个字节序列

由存储类型的字节序列(存于内存或磁盘的)与显示类型的字节序列

如: 整型数18    在内存上是4个字节的字节序列:00000000 00000000 00000000 00000012

而要显示给人们看的是十进制格式的形式: 两个字节的18 ,即传给显示器的字节序列为:00000001 00001000

要输入整型数18,键盘就依次 18

 

 

 

头文件:#define < stdio.h >

包含C语言的三类输入输出操作函数:

磁盘文件读写操作函数、内容格式化函数、标准输入输出格式化函数

.磁盘文件读写操作函数(文件流方式)

FILE结构体:

typedef struct

{

        unsigned char  *curp;       /* Current active pointer   *////当前活动指针

        unsigned char  *buffer;     /* Data transfer buffer     *///数据缓冲区

        int            level;      /* fill/empty level of buffer *///缓冲区填充\空程序,0表缓冲区空,

        int            bsize;      /* Buffer size           *////缓冲区大小

        unsigned short  istemp;     /* Temporary file indicator  *///临时文件描述符

        unsigned short  flags;      /* File status flags         *////文件状态标志,见下

///#define _F_RDWR  0x0003  /* /写标志 */

///#define _F_READ  0x0001  /* 只读文件 */

///#define _F_WRIT  0x0002   /* 只写文件 */

///#define _F_BUF   0x0004   /* Malloc'ed Buffer data */

///#define _F_LBUF  0x0008   /* line-buffered file    */

///#define _F_ERR   0x0010   /* 错误标志 */

///#define _F_EOF   0x0020   /* EOF指示符 */

///#define _F_BIN   0x0040   /* 二进制文件 indicator */

///#define _F_IN    0x0080   /* 数据正在输入中(即正在读取文件中) */

///#define _F_OUT  0x0100  /* 数据正在输出中(即正在写入文件中) */

///#define _F_TERM 0x0200  /* 文件是终端 */

        wchar_t        hold;       /* Ungetc char if no buffer */

        char           fd;         /* File descriptor        *////文件的描述符

        unsigned char   token;      /* Used for validity checking *///用于有效性验证

}FILE ;

 

//////打开文件
函数 FILE * fopen(const char * path , const char * mode);

参数:

path  指定要打开的文件(绝对路径或相对路径)

mode 文件打开模式字符串:rw+atb 六个字符拼成,各字符的含义是:  

r (read):
w (write):

+:
读和写

a (append): 追加
t (text):
文本文件,可省略不写
b (banary):
二进制文件

组合方式只能是:

      [+][t/b]

      [t/b][+]

说明:<>表这部分必须有,[]表可选, / 表只能选其中一个 。如:r+b    wt
  

模式

打开后可执行的操作

操作结果

r

只能读取文件

若指定文件不存在,打开失败,返回NULL

w

以独占方式打开文件(即别的程序只能读而不能写该文件),只能写入文件,不能读取文件内容

若文件存在,成功打开后先清空该文件内容

若文件不存在则建立该文件

r+

读写文件

若指定文件不存在,打开失败,返回NULL

w+

以独占方式打开文件,可读写文件

若文件存在,成功打开后清空该文件内容

若文件不存在则建立该文件

a

以追加方式(这种方式只能在文件尾添加数据)打开,只能写入文件

如果文件存在,只能在文件尾添加要写入的数据,对原有数据修改会失败。

文件不存在,则会建立该文件

a+

以追加方式打开,可读写的文件

如果文件存在,只能在文件尾添加要写入的数据,对原有数据修改会失败。

若文件不存在,则会建立该文件

返回值:

若打开成功,返回指向该文件的流结构的指针。

若打开失败,则返回NULL,并把错误代码存在errno 中。  

 

 

//////关闭文件
函数 int  fclose ( FILE * stream ) ;
返回值:

若成功,则返回0

有错误发生时,则返回EOF,并把错误代码存到errno
函数说明:

 fclose() 用来关闭先前fopen( )打开的文件。此动作会把缓冲区内的数据写入磁盘文件中同时清空,并释放系统所提供的文件资源。


//////调用fflush( ),并清除FILEflags域,移动文件流的读写位置

函数 int  fseek ( FILE *  stream , long  offset , int  whence ) ;

参数:

offset  指定相对基准的偏移量

     数时,向后偏移 |offset| 个字节;

     数时,向前偏移 |offset| 个字节。

whence   为下列其中一种:
             SEEK_SET  0 
文件开头为基准,偏移offset位移量为新的读写位置。

SEEK_CUR  1  当前读写位置为基准,偏移offset个位移量作为新读写位置。
      SEEK_END  2  文件末尾为基准,偏移offset个位移量为新读写位置。

返回值:

当调用成功时,则返回0;

若有错误,则返回EOFerrno会存放错误代码。

 

 

特别注意:在进入读取或写入模式前,要调用fseek( )函数一次,否则操作失败

/////*******在调用以下的函数后,进入文件读取进行中模式
///////由文件中读取一个字符
函数 int  fgetc ( FILE * stream ) ;
返回值:

成功,则返回读取到的字符;

若返回EOF则表示到了文件尾。

函数说明:

 fgetc()从参数stream所指的文件中读取一个字符

 

 

//////由文件中读取一字符串
函数 char * fgets ( char  * s , int  size , FILE * stream ) ;

返回值:

若成功,则返回传进的s指针;

若有错误发生,则返回NULL

函数说明:

该函数用来从参数stream所指的文件内依次读入字符并存到参数s所指的内存空间,直到出现(依次有效)换行字符到达文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。

 

//////从文件流读取数据块到内存指定的缓冲区   

函数 size_t  fread ( void * ptr , size_t  size , size_t  num , FILE * stream ) ;

参数:

       ptr ,为用于存放读取到的数据的内存区;

size为要读取的数据块的大小(字节单位)

num要连续读取多少个这样大小的数据块。

返回值:

返回实际读取到的num数目。如果此值比参数num来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()ferror()来决定发生什么情况。

函数说明:

该函数用来从stream指向的文件流中读取size * num个字节数据到ptr指向的缓冲区中。


/////*******文件读取模式

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

chinaunix网友2010-10-15 16:19:56

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com