输入输出函数

《C与指针》读书笔记
1. 错误报告
void perror(char const *message);
perror函数以一种简单、同一的方式报告错误。
2.终止执行
void exit(int status);
它用于终止一个程序。预定义的符号EXIT_SUCCESS和EXIT_FAILURE分别代表程序的终止时成功还是失败。
3 标准I/O函数库
ANSI C规定了标准I\O函数库
4 ANSI I/O概念
4.1 流
ANSI C对I/O的概念进行了抽象。就C程序而言,所有的I/O操作只是简单地从程序移进或移出字节的事情。因此,这种字节流被称为流。
绝大多数流是完全缓冲的,这意味着“读取”和“写入”实际上是从一块被称为缓冲区(buffer)的内存区域来回复制数据。
(1)文本流
流分为两种类型,文本流和二进制流。标准规定文本行的最大长度最少254个字符。在MS-DOS系统中,文本文件约定以一个回车符和一个换行符结尾。UNIX系统使用一个换行符结尾。
(2)二进制流
二进制流中的字节将完全根据程序编写它们的形式写入到文件或设备中,而且完全根据它们从文件或设备读取的形式读入到程序中。
4.2 文件
stdio.h所包含的声明之一就是FILE结构。FILE是一个数据结构,用于访问一个流。
对于ANSI C程序,运行时系统必须提供至少三个流——标准输入、标准输出和标准错误。这些流的名字分别为stdin、stdout、stderr。
4.3 标准I/O常量
(1)EOF
EOF提示文件尾。
(2)FOPEN_MAX
一个程序同时最多能够打开多少个文件。
(3)FILENAME_MAX
合法文件名最长长度。
5 流I/O总览
下面是关于文件I/O的一般概况。
1.程序为必须同时处于活动状态的每个文件声明一个指针变量,其类型为FILE*。
2.流通过调用fopen函数打开。
3.根据需要对该文件进行读取或写入。
4.最后,调用fclose函数关闭流。
I/O函数以三种基本形式处理数据:单个字符、文本行和二进制数据。
数据类型 输入 输出 描述
字符 getchar putchar 读取(写入)单个字符
文本行 gets
scanf
puts
printf
文本行未格式化的输入(输出)
格式化的输入(输出)
二进制数据 fread fwrite 读取(写入)而精致数据
6 打开流
FILE *fopen(char const *name,char const *mode);
name是打开的文件或设备的名字。mode提示流是用于只读、只写、还是既读又写。
  读取 写入 添加
文本“r”“w”“a”
二进制“rb”“wb”“ab”
FILE *freopen(char const *filename,char const *name,FILE *stream);
freopen函数用于打开(或者重新打开)一个特定的文件流。
最后一个参数就是需要打开的流。它可能是一个先前从fopen函数返回的流,也可能是标准流stdin,stdout或stderr。
这个函数首先试图关闭这个流,然后用指定的文件和模式重新打开这个流。如果打开失败,函数返回一个NULL值。
7.关闭流
int fclose(FILE *f);
对于输出流,fclose函数在文件关闭之前刷新缓冲区。如果它执行成功,fclose返回零值,否则返回EOF。
8 字符I/O
字符输入是由getchar函数家族执行的。
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);
每个函数从流中读取下一个字符,并把它作为函数的返回值返回。
为了把单个字符写入到流中,你可以使用putchar函数家族。它们的函数原型:
int fputc(int character,FILE *stream);
int putc(int character,FILE *stream);
int putchar(int character);
8.1 字符I/O宏
fgetc和fputc都是真正的函数,但getc、putc、getchar和putchar都是通过#define指令定义的宏。
8.2 撤销字符I/O
int ungetc(int charecter,FILE *stream);
ungetc把一个先前读入的字符返回到流中。
9 未格式化的行I/O
行I/O可以用两种方式执行——未格式化的或格式化的。
gets和puts函数家族是用于操作字符串。
char *fgets(char *buffer,int buffer_size,FILE *stream);
char *gets(char *buffer);
fgets从指定的stream读取字符并把它们复制到buffer中。当它读取一个换行符并存储到缓冲区之后就不再读取。如果缓冲区内存储的字符数达到buffer_size-1个时,它也停止读取。
int fputs(char const *buffer,FILE *stream);
int puts(char const *buffer);
传递给fputs的缓冲区必须包含一个字符串,它的字符被写入到流中。如果写入错误,fputs返回常量值EOF。
10 格式化的行I/O
10.1 scanf家族
int fscanf(FILE *stream,char const *format,...);
int scanf(char const *format,...);
int sscanf(char const *string,char const *format);
这些函数都从输入源读取字符并根据format字符串给出的格式代码对它们进行转换。
10.2 scanf格式代码
scanf函数家族的格式代码都以一个%开头,后面可以是(1)一个可选的星号,(2)一个可选的宽度,(3)一个可选的限定符,(4)格式代码。星号将使转换后的值被丢弃而不是进行存储。
10.3 printf家族
int fprintf(FILE *stream,char const *format,...);
int printf(char const *format,...);
int sprintf(char *buffer,char const *format,...);
printf函数家族用于创建格式化输出。
10.4 printf格式代码
格式代码由一个百分号开头,后面跟(1)零个或多个标志字符,用于修改有些转换的执行方式,(2)一个可选的最小字段宽度,(3)一个可选的精度,(4)一个可选的修改字符,(5)装换类型。
11 二进制I/O
size_t fread(void *buffer,size_t size,size_t count,FILE *stream);
size_t fwrite(void *buffer,size_t size,size_t count,FILE *stream);
fread函数用于读取二进制数据,fwrite函数用于写入二进制数据。
12 刷新和定位函数
int fflush(FILE *stream);
它迫使一个输出流的缓冲区内的数据进行物理写入,不管它是不是已经写满。当我们需要立即把输出缓冲区的数据进行物理写入时,应该使用这个函数。
long ftell(FILE *stream);
int fseek(FIEL *stream,long ofset,int from);
ftell返回流的当前位置。ftell函数返回值总是可以用于fseek函数中,作为一个距离文件起始位置的偏移量。
fseek函数允许你在一个流中定位。from字段的值以及含义。
如果from是…你将定位到…
SEEK_SET从流的起始位置起offset个字节,offset必须是一个非负值
SEEK_CUR从流的当前位置起offset个字节,offset的值可正可负
SEEK_END从流的尾部位置起offset个字节,offset的值可正可负。如果是正值,它将定位到文件尾后面
用fseek改变一个流的位置会带来三个副作用。首先,行末指示字符被清楚。其次,如果在fseek之前使用ungetc把一个字符返回到流中,那么这个被退回的字符会被丢弃。最后,定位允许你从写入模式切换到读取模式。
void rewind(FILE *stream);
int fgetpos(FILE *stream,fpos_t *position);
int fsetpos(FILE *stream,fpos_t const *position);
rewind函数将读写指针设置回指定流的起始位置。它同时清楚流的错误提示标志。fgetpos和fsetpos分别是ftell和fseek的替代方案。
13 改变缓冲方式
void setbuf(FILE *stream,char *buf);
void setvbuf(FILE *stream,char *buf);
setbuf设置了另一个数组,用于对流进行缓冲。这个数组的字符长度必须为BUFSIZ。为一个流自行定义缓冲区可以防止I/O函数库为它动态分配一个缓冲区。
setvbuf函数更为通用。mode参数用于指定缓冲的类型。_IOFBF指定一个完全缓冲流,_IONBF指定一个不缓冲流,_IOLBF指定一个行缓冲流。所谓行缓冲,就是每当一个换行符写入到缓冲区时,缓冲区便进行刷新。
如果需要使用一个很大的缓冲区,它的长度应该是BUFSIZ的整数倍,不然操作系统可能需要一些额外的操作。
14 流错误函数
int feof(FILE *stream);
int ferror(FILE *stream);
int clearerr(FILE *stream);
如果流当前处于文件尾,feof函数返回真。这个状态可以通过对流执行fseek、rewind、或fsetpos函数来清除。ferror函数报告流的错误状态,如果出现任何读/些函数就返回真。最后,clearerr函数对指定流的错误标志进行重置。
15 临时文件
FILE *tmpfile(void);
这个函数创建了一个文件,当文件被关闭或程序终止时这个文件便自动删除。该文件以wb+模式打开,这使它可用于二进制和文本数据。
char *tmpnam(char *name);
临时文件的名字可以用tmpnam来创建。
16 文件操纵函数
int remove(char const *filename);
int rename(char const *oldname,char const *newname);
remove函数删除一个指定的文件。
rename函数用于改变一个文件的名字,从oldname改为newname。










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值