标准IO库函数Word下载.docx
- 文档编号:15765588
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:29
- 大小:51.55KB
标准IO库函数Word下载.docx
《标准IO库函数Word下载.docx》由会员分享,可在线阅读,更多相关《标准IO库函数Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
-rw-r--r--1akaeduakaedu52009-03-2010:
58textfile
5678四个字符各占一个字节,vi会自动在文件末尾加一个换行符,所以文件长度是5。
用od命令查看该文件的内容:
$od-tx1-tc-Axtextfile
000000353637380a
5678\n
000005
-tx1选项表示将文件中的字节以十六进制的形式列出来,每组一个字节,-tc选项表示将文件中的ASCII码以字符形式列出来。
和hexdump类似,输出结果最左边的一列是文件中的地址,默认以八进制显示,-Ax选项要求以十六进制显示文件中的地址。
这样我们看到,这个文件中保存了5个字符,以ASCII码保存。
ASCII码的范围是0~127,所以ASCII码文本文件中每个字节只用到低7位,最高位都是0。
以后我们会经常用到od命令。
文本文件是一个模糊的概念。
有些时候说文本文件是指用vi可以编辑出来的文件,例如/etc目录下的各种配置文件,这些文件中只包含ASCII码中的可见字符,而不包含像'
\0'
这种不可见字符,也不包含最高位是1的非ASCII码字节。
从广义上来说,只要是专门保存字符的文件都算文本文件,包含不可见字符的也算,采用其它字符编码(例如UTF-8编码)的也算。
2.2.
fopen/fclose请点评
在操作文件之前要用fopen打开文件,操作完毕要用fclose关闭文件。
打开文件就是在操作系统中分配一些资源用于保存该文件的状态信息,并得到该文件的标识,以后用户程序就可以用这个标识对文件做各种操作,关闭文件则释放文件在操作系统中占用的资源,使文件的标识失效,用户程序就无法再操作这个文件了。
#include<
stdio.h>
FILE*fopen(constchar*path,constchar*mode);
返回值:
成功返回文件指针,出错返回NULL并设置errno
path是文件的路径名,mode表示打开方式。
如果文件打开成功,就返回一个FILE*文件指针来标识这个文件。
以后调用其它函数对文件做读写操作都要提供这个指针,以指明对哪个文件进行操作。
FILE是C标准库中定义的结构体类型,其中包含该文件在内核中标识(在第
2
节“C标准I/O库函数与UnbufferedI/O函数”将会讲到这个标识叫做文件描述符)、I/O缓冲区和当前读写位置等信息,但调用者不必知道FILE结构体都有哪些成员,我们很快就会看到,调用者只是把文件指针在库函数接口之间传来传去,而文件指针所指的FILE结构体的成员在库函数内部维护,调用者不应该直接访问这些成员,这种编程思想在面向对象方法论中称为封装(Encapsulation)。
像FILE*这样的指针称为不透明指针(OpaquePointer)或者叫句柄(Handle),FILE*指针就像一个把手(Handle),抓住这个把手就可以打开门或抽屉,但用户只能抓这个把手,而不能直接抓门或抽屉。
下面说说参数path和mode,path可以是相对路径也可以是绝对路径,mode表示打开方式是读还是写。
比如fp=fopen("
/tmp/file2"
"
w"
);
表示打开绝对路径/tmp/file2,只做写操作,path也可以是相对路径,比如fp=fopen("
file.a"
r"
表示在当前工作目录下打开文件file.a,只做读操作,再比如fp=fopen("
../a.out"
只读打开当前工作目录上一层目录下的a.out,fp=fopen("
Desktop/file3"
只写打开当前工作目录下子目录Desktop下的file3。
相对路径是相对于当前工作目录(CurrentWorkingDirectory)的路径,每个进程都有自己的当前工作目录,Shell进程的当前工作目录可以用pwd命令查看:
$pwd
/home/akaedu
通常Linux发行版都把Shell配置成在提示符前面显示当前工作目录,例如~$表示当前工作目录是主目录,/etc$表示当前工作目录是/etc。
用cd命令可以改变Shell进程的当前工作目录。
在Shell下敲命令启动新的进程,则该进程的当前工作目录继承自Shell进程的当前工作目录,该进程也可以调用chdir
(2)函数改变自己的当前工作目录。
mode参数是一个字符串,由rwatb+六个字符组合而成,r表示读,w表示写,a表示追加(Append),在文件末尾追加数据使文件的尺寸增大。
t表示文本文件,b表示二进制文件,有些操作系统的文本文件和二进制文件格式不同,而在UNIX系统中,无论文本文件还是二进制文件都是由一串字节组成,t和b没有区分,用哪个都一样,也可以省略不写。
如果省略t和b,rwa+四个字符有以下6种合法的组合:
"
只读,文件必须已存在
只写,如果文件不存在则创建,如果文件已存在则把文件长度截断(Truncate)为0字节再重新写,也就是替换掉原来的文件内容
a"
只能在文件末尾追加数据,如果文件不存在则创建
r+"
允许读和写,文件必须已存在
w+"
允许读和写,如果文件不存在则创建,如果文件已存在则把文件长度截断为0字节再重新写
a+"
允许读和追加数据,如果文件不存在则创建
在打开一个文件时如果出错,fopen将返回NULL并设置errno,errno稍后介绍。
在程序中应该做出错处理,通常这样写:
if((fp=fopen("
/tmp/file1"
))==NULL){
printf("
erroropenfile/tmp/file1!
\n"
exit
(1);
}
比如/tmp/file1这个文件不存在,而r打开方式又不会创建这个文件,fopen就会出错返回。
再说说fclose函数。
intfclose(FILE*fp);
成功返回0,出错返回EOF并设置errno
把文件指针传给fclose可以关闭它所标识的文件,关闭之后该文件指针就无效了,不能再使用了。
如果fclose调用出错(比如传给它一个无效的文件指针)则返回EOF并设置errno,errno稍后介绍,EOF在stdio.h中定义:
/*Endoffilecharacter.
Somethingsthroughoutthelibraryrelyonthisbeing-1.*/
#ifndefEOF
#defineEOF(-1)
#endif
它的值是-1。
fopen调用应该和fclose调用配对,打开文件操作完之后一定要记得关闭。
如果不调用fclose,在进程退出时系统会自动关闭文件,但是不能因此就忽略fclose调用,如果写一个长年累月运行的程序(比如网络服务器程序),打开的文件都不关闭,堆积得越来越多,就会占用越来越多的系统资源。
2.3.
stdin/stdout/stderr请点评
我们经常用printf打印到屏幕,也用过scanf读键盘输入,这些也属于I/O操作,但不是对文件做I/O操作而是对终端设备做I/O操作。
所谓终端(Terminal)是指人机交互的设备,也就是可以接受用户输入并输出信息给用户的设备。
在计算机刚诞生的年代,终端是电传打字机和打印机,现在的终端通常是键盘和显示器。
终端设备和文件一样也需要先打开后操作,终端设备也有对应的路径名,/dev/tty就表示和当前进程相关联的终端设备(在第
1.1
节“终端的基本概念”会讲到这叫进程的控制终端)。
也就是说,/dev/tty不是一个普通的文件,它不表示磁盘上的一组数据,而是表示一个设备。
用ls命令查看这个文件:
$ls-l/dev/tty
crw-rw-rw-1rootdialout5,02009-03-2019:
31/dev/tty
开头的c表示文件类型是字符设备。
中间的5,0是它的设备号,主设备号5,次设备号0,主设备号标识内核中的一个设备驱动程序,次设备号标识该设备驱动程序管理的一个设备。
内核通过设备号找到相应的驱动程序,完成对该设备的操作。
我们知道常规文件的这一列应该显示文件尺寸,而设备文件的这一列显示设备号,这表明设备文件是没有文件尺寸这个属性的,因为设备文件在磁盘上不保存数据,对设备文件做读写操作并不是读写磁盘上的数据,而是在读写设备。
UNIX的传统是Everythingisafile,键盘、显示器、串口、磁盘等设备在/dev目录下都有一个特殊的设备文件与之对应,这些设备文件也可以像普通文件一样打开、读、写和关闭,使用的函数接口是相同的。
本书中不严格区分“文件”和“设备”这两个概念,遇到“文件”这个词,读者可以根据上下文理解它是指普通文件还是设备,如果需要强调是保存在磁盘上的普通文件,本书会用“常规文件”(RegularFile)这个词。
那为什么printf和scanf不用打开就能对终端设备进行操作呢?
因为在程序启动时(在main函数还没开始执行之前)会自动把终端设备打开三次,分别赋给三个FILE*指针stdin、stdout和stderr,这三个文件指针是libc中定义的全局变量,在stdio.h中声明,printf向stdout写,而scanf从stdin读,后面我们会看到,用户程序也可以直接使用这三个文件指针。
这三个文件指针的打开方式都是可读可写的,但通常stdin只用于读操作,称为标准输入(StandardInput),stdout只用于写操作,称为标准输出(StandardOutput),stderr也只用于写操作,称为标准错误输出(StandardError),通常程序的运行结果打印到标准输出,而错误提示(例如gcc报的警告和错误)打印到标准错误输出,所以fopen的错误处理写成这样更符合惯例:
fputs("
Erroropenfile/tmp/file1\n"
stderr);
fputs函数将在稍后详细介绍。
不管是打印到标准输出还是打印到标准错误输出效果是一样的,都是打印到终端设备(也就是屏幕)了,那为什么还要分成标准输出和标准错误输出呢?
以后我们会讲到重定向操作,可以把标准输出重定向到一个常规文件,而标准错误输出仍然对应终端设备,这样就可以把正常的运行结果和错误提示分开,而不是混在一起打印到屏幕了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 标准 IO 库函数