分类: C/C++
2010-10-14 20:01:39
C的I/O操作和数据格式化函数(一)
磁盘的任何文件的内容是字节序列。内存也是字节序列。
如果以"文本"方式打开一个文件,那么在读字符的时候,系统会把所有的"\r\n"序列转成"\n",在写入时把"\n"转成"\r\n" ;
按文本方式往文件的读写Buffer中写入数据时,一旦遇到换行字符’\n’(ASCII值为0x
而以“二进制”方式打开文件时,读写则不做这样的转换。
注:只对Windows系统有效,unix/linux系统就不做这样的转换。
输入设备输入向内存的数据也是字节序列,输出设备读取的内存数据也是字节序列。
各种数据类型是占据内存的一定数目的字节序列。
数据解释(转换)是一个字节序列 变成 另一个字节序列 。
由存储类型的字节序列(存于内存或磁盘的)与显示类型的字节序列 。
如: 整型数18 在内存上是4个字节的字节序列:00000000 00000000 00000000 00000012
而要显示给人们看的是十进制格式的形式: 两个字节的1和8 ,即传给显示器的字节序列为: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 文件打开模式字符串:由r、w、+、a、t、b 六个字符拼成,各字符的含义是:
r (read): 读
w (write): 写
+: 读和写
a (append): 追加
t (text): 文本文件,可省略不写
b (banary): 二进制文件
组合方式只能是:
说明:<>表这部分必须有,[]表可选, / 表只能选其中一个 。如:r+b wt等
模式 |
打开后可执行的操作 |
操作结果 |
r |
只能读取文件 |
若指定文件不存在,打开失败,返回NULL |
w |
以独占方式打开文件(即别的程序只能读而不能写该文件),只能写入文件,不能读取文件内容 |
若文件存在,成功打开后先清空该文件内容 若文件不存在则建立该文件。 |
r+ |
可读写文件 |
若指定文件不存在,打开失败,返回NULL |
w+ |
以独占方式打开文件,可读写文件 |
若文件存在,成功打开后清空该文件内容 若文件不存在则建立该文件。 |
a |
以追加方式(这种方式只能在文件尾添加数据)打开,只能写入文件 |
如果文件存在,只能在文件尾添加要写入的数据,对原有数据修改会失败。 若文件不存在,则会建立该文件 |
a+ |
以追加方式打开,可读写的文件 |
如果文件存在,只能在文件尾添加要写入的数据,对原有数据修改会失败。 若文件不存在,则会建立该文件 |
返回值:
若打开成功,返回指向该文件的流结构的指针。
若打开失败,则返回NULL,并把错误代码存在errno 中。
//////关闭文件
函数 int fclose ( FILE * stream ) ;
返回值:
若成功,则返回0;
有错误发生时,则返回EOF,并把错误代码存到errno。
函数说明:
fclose() 用来关闭先前fopen( )打开的文件。此动作会把缓冲区内的数据写入磁盘文件中同时清空,并释放系统所提供的文件资源。
//////调用fflush( ),并清除FILE的flags域,移动文件流的读写位置
函数 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;
若有错误,则返回EOF,errno会存放错误代码。
特别注意:在进入读取或写入模式前,要调用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指向的缓冲区中。
/////*******文件读取模式
chinaunix网友2010-10-15 16:19:56
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com