C语言中的输入输出函数

一.错误报告

1.perror()函数是一种简单、统一的方式报告错误。ansi c 函数库的许多函数调用操作系统来完成某些任务,I/O函数尤其如此。任何时候,当操作系统根据要求执行一些任何的时候,都存在失败的可能。标准库函数在一个外部整型变量errno(在errno.h中定义)中保存错误代码之后把这个信息传递给用户程序,提示操作失败的准确原因。

2.perror()函数的原型:

#include<stdio.h>

void  perror(charconst  *message);

如果message不是NULL并且指向一个非空的字符串,perror函数就打印出这个字符串,后面跟一个分号和一个空格,然后打印出一条用于解释errno当前错误代码的信息。

3.perrno函数的最大优点是容易使用。良好的编程实践要求任何可能产生错误的操作读应该在执行之后进行检查,确定它是否成功执行。

说明:

只有当一个库函数失败时,errno才会被设置。当函数成功执行时,errno的值不会被需改。因此,不能通过测试errno的值来判断是否有错误发生。所以只有当被调用的函数提示有错误发生时检查errno的值才有意义。

二.终止执行

1.终止执行的函数是exit,它用于终止一个程序的执行。

2.它的原型为:

#include<stdlib.h>

void  exit(intstatus);

3.status参数返回给操作系统,用于提示程序是否正常完成。

这个值和main()函数返回的整型状态值相同。预定义符号EXIT_SUCCESS和EXIT__FAILURE分别提示程序的终止是成功还是失败。

4.当程序发现错误情况使它无法继续执行下去时,可以使用该函数。我们经常会在调用perrno之后再调用exit终止程序

5.该函数没有返回值。当exit函数结束之后,程序已经消失。

三.文本流

1.流分为两种类型,文本(text)流和二进制流(binary)流。

2.文本流的有些特性在不同的系统中可能不同。其中之一就是文本的行的最大长度。 标准规定至少允许254个字符。另一个可能不同的特性是文本行的结束方式。

1>在MS-DOS系统中,文本行预定以一个回车符和一个换行符结尾。

2>在UNIX系统中只使用一个换行符结尾。

3.标准文本行定义为零个或多个字符,后面跟一个表示结束的换行符。

四.二进制流

1.二进制流中的字节将完全根据程序编写它们的形式写入到文件或设备中,而且完全根据它们从文件或设备读取的形式读入到程序中。

2.这种类型的流适用于非文本数据,但是如果I/O函数修改文本文件的行末字符,也可以把它用于文本文件。

五文件

1.stdio.h所包含的声明之一就是FILE结构。FILE是一个数据结构,用于访问一个流。

2.如果同时激活了几个流,每个流都有一个相应的FILE与它关联。为了在流上执行一些操作,可以调用一些合适的函数,并向它们传递一个与这个流关联的FILE参数。

3.对于每个ANSI C程序,运行时系统必须提供至少三个流:

1>标准输入(standard  input):标准输入是缺省情况下输入的来源。

2>标准输出(standard  output) :标准输出是缺省的输出设置

3>标准错误(standard   error):就是错误写入的地方。Perror函数把它的输出也写到这个地方。在许多系统中,标准输出和标准错误在缺省情况下相同的。但是,为错误信息准备一个不同的流以为着,即使标准输出重定向到其他地方,错误信息仍将出现在屏幕或其他缺省的输出设备上。

这些流的名字分别是stdin、stout和stderr。它们都是一个指向FILE结构的指针。

4.许多操作系统允许用户在程序执行时修改缺省的标准输入和输出设备.

例如:

MS-DOS和UNIX系统都支持用下面的方法进行输入/输出重定向:program <  data  > answer

当该程序执行时,它将从文件data 而不是键盘作为标准输入进行读取,它将把标准输出写入到文件answer而不是屏幕上。

5.程序为必须同时活动状态的每个文件声明一个指针变量,其类型为FILE *。这个指针指向这个FILE结构,当它处于活动状态时由流使用。

6.流通过调用fopen函数打开。为了打开一个流,你必须指定需要访问的文件或设备以及它们的访问方式(例如:读、写或者既读又写)。fopen()和操作系统验证文件或设备确实存在并初始化FILE结构。然后,根据需要对该文件进行读取或写入。最后,调用flose函数关闭流。关闭一个流可以防止与它相关联的文件被再次访问,保证任何存储于缓冲区的数据被正确地写到文件中,并且释放FILE结构使它可以用于另外的文件。

7.I/O函数以三种基本的形式处理数据:单个字符、文本行和二进制数据。对于每种形式,都有一组特定的函数对它们进行处理。

8.打开流

1>fopen()函数打开一个特定的文件,并把一个流和这个文件相关联。原型如下:

FILE *fopen(char  const  *name,char const  *mode);

Ø  两个参数都是字符串。

Ø  name是打开的文件或设备的名字。创建文件名的规则在不同系统中各不相同,所以fopen()把文件名作为一个字符串而不是路径名、驱动器字母、文件扩张名等各准备一个参数。这个参数指定要打开的文件—FILE *变量的名字是程序用来保存fopen的返回数值的,它并不影响哪个文件被打开。

Ø  mode(模式)参数提示流是用于只读、只写还是既读有写,以及它是文本流还是二进制流。

Ø  mode以r、w或a开头,分别表示打开的流用于读取、写入还是添加。如果一个文件打开是用于读取的,那么它必须是原先已经存在的。但是,如果一个文件打开是用于写入的,如果它原先已经存在,那么它原来的内容就会被删除。如果它原先不存在,那么就创建一个新文件。如果一个打开用于添加的文件并不存在,那么它将被删除。如果它原先已经存在,它原先的内容并不会被删除。无论在那一种情况下,数据只能从文件的尾部写入。

Ø  在mode中添加”a+”表示该文件打开用于更新,并且流既允许读也允许写。但是,如果已经从文件读入了一些数据,那么在开始向它写入数据之前,你必须调用其中一个文件定位函数(fseek、fsetpos、rewind)。

Ø  在向文件写入一些数据之后,如果想从该文件读取一些数据数据,必须首先调用fflush函数或者文件定位函数之一。

Ø  如果fopen()函数执行成功,它返回一个指向FILE结构的指针,该结构代表这个新创建的流。如果函数执行失败,它就返回一个NULL指针,errno会提示问题的性质。

说明:应该始终检查返回fopen函数的返回值。如果函数失败,它会返回一个NULL值。如果程序检查错误,这个NULL指针就会传给后续的I/O函数。

9.关闭流

1>流是用函数fclose关闭的,它的原型如下:

int fclose(FILE  *f);

对于输出流,fclose函数在文件关闭之前刷新缓冲区。 如果它执行成功,fclose返回零,否则返回EOF。

六.标准I/O常量

1.在stdio.h中定义了数量众多的与输入和输出有关常量。其中,EOF所选择的实际值比一个字符要多几位,这是为了避免二进制被错误地解释为EOF。

2.一个程序同时最多能打开多少个文件呢?

他可以保证能够同时打开至少FOPEN_MAX个文件。这个常量包括了三个标准流,它的值至少是8。

3.常量FILENAME_MAX是一个整型值,用于提示一个字符数组应该多大以便容纳编译器所支持的最长合法文件名。

七.临时文件

1.在程序中,我们会使用一个文件来临时保存数据。当程序结束时,这个文件便被删除,因为它所包含的数据不再使用。

2.tmpfile()函数

1>函数功能:创建一个文件,当文件被关闭或程序终止时这个文件便自动删除。该文件以wb+模式打开,这使它可用于二进制和文本数据。

2>如果临时文件必须以其他模式打开或者由一个程序打开但由另一个程序读取,就不适合用tmpfile函数创建。在这些情况下,必须使用fopen函数,而且当结果文件不再需要时必须使用remove函数显示地删除。

3>临时文件的名字可以用tmpnam函数创建,它的原型如下:

char  *tmpnam(char  *name);

如果传递给函数的参数为NULL,那么该函数便返回一个指向静态数组的指针,该数组包含了被创建的文件名。否则,参数便假定是一个指定长度至少为L_tmpnam的字符数组的指针。在这种情况下,文件名在这个数组中创建,返回值就是这个参数。无论哪种情况,这个被创建的文件名保证不会与已经存在的文件名同名。只要调用次数不超过TMP_MAX次,tmpnam函数每次调用时都能产生一个新的不同名字。

八.文件操纵函数

1.有两个函数用于操纵文件但不执行任何输入/输出操作。

1>函数原型,如果执行成功,这两个函数都返回零值。如果失败,它们都返回非零值。

int  remove(char  const *filename);

int  rename(char  const *oldname,char  const *newname);

2>remove函数删除一个指定的文件。如果当remove被调用时文件处于被打开状态,其结果则取决于编译器。

3>rename函数用于改变一个文件的名字,从oldname改为newname。如果已经有一个名为newname的文件存在,其结果取决于编译器。如果这个函数失败,文件任然可以用原来的名字进行访问。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冀博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值