您的位置:首页 > 编程语言 > C语言/C++

C语言中的stdio头文件解析

2018-02-02 22:01 1576 查看
stdio .h 头文件定义了三个变量类型、一些宏和各种函数来执行输入和输出。

三个变量:

1:size_t

2:FILE :这是一个适合存储文件流信息的对象类型。

3:fpos_t :这是一个适合存储文件中任何位置的对象类型。

定义的几个宏:

1:NULL

2:_IOFBF、_IOLBF、_IONBF:这些宏为带有特定值的整型常量表达式,并适用于 setvbuf 函数的第三个参数。

3:BUFSIZ:这个宏是一个整数,该整数代表了 setbuf 函数使用的缓冲区大小。

4:EOF:表示一个已经达到文件结束的负整数。

5:FOPEN_MAX:是一个整数,表示系统可以同时打开的文件数量。

6:FILENAME_MAX:一个整数,代表了字符数组可以存储的文件名的最大长度。

7:L_tmpnam:是一个整数,该整数代表了字符数组可以存储的由 tmpnam 函数创建的临时文件名的最大长度。

8:SEEK_CUR、SEEK_END和SEEK_SET:用于fseek函数,表示在一个文件中的不同位置。

9:TMP_MAX:是 tmpnam 函数可生成的独特文件名的最大数量。

10:stderr、stdin和stdout:分别表示标准错误、标准输入、标准输出流。

一些函数:

文件操作函数

remove函数

函数原型: int remove(const char *filename);

函数描述:删除给定的文件名 filename,以便它不再被访问。

函数返回:如果成功,则返回零。如果错误,则返回 -1,并设置 errno。

rename函数

函数原型: int rename(const char *old_filename, const char *new_filename);

函数描述: 把 old_filename 所指向的文件名改为 new_filename。

函数返回:如果成功,则返回零。如果错误,则返回 -1,并设置 errno。

tmpfile函数

函数原型: FILE *tmpfile(void);

函数描述:以二进制更新模式(wb+)创建临时文件。被创建的临时文件会在流关闭的时候或者在程序终止的时候自动删除。

函数返回:如果成功,该函数返回一个指向被创建的临时文件的流指针。如果文件未被创建,则返回 NULL。

tmpnam函数

函数原型:char *tmpnam(char *str) ;

函数描述:生成并返回一个有效的临时文件名,该文件名之前是不存在的。如果 str 为空,则只会返回临时文件名。

函数返回:返回一个有效的临时文件名。

文件获取类函数:

fclose函数

函数原型:int fclose(FILE *stream) ;

函数描述:关闭流,并刷新所有的缓冲区。

函数返回:如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。

特点:

1:fclose与fopen对应,当打开一个流,就要记得关闭一个流。当程序结束时,会自动关闭打开的流。

2:若打开一个流,而没有关闭,可能造成的问题是,数据没有及时的同步磁盘上,或数据根本就无法读写。

3:若想不用关闭流,就将数据及时的刷新出去,用fflush函数。

fflush函数

函数原型:int fflush ( FILE * stream );

函数描述:刷新流stream的输出缓冲区。

函数返回:如果成功,该函数返回零值。如果发生错误,则返回 EOF,且设置错误标识符(即 feof)。

特点:

1:函数结束后,流仍打开。

fopen函数

函数原型:FILE * fopen ( const char * filename, const char * mode );

函数描述:使用给定的模式mode打开filename所指向的文件。

函数返回:成功返回一个FILE指针,否则返回 NULL。

Mode类型:

模式描述
“r”打开一个用于读取的文件。该文件必须存在。
“w”创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
“a”追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
“r+”打开一个用于更新的文件,可读取也可写入。该文件必须存在。
“w+”创建一个用于读写的空文件。若文件已存在,将会丢弃文件中的内容。
“a+”打开一个用于读取和追加的文件。若该文件不存在,将自动创建。
若想以二进制形式打开文件,可以在后面加上字符‘b’。

特点:

1:fopen打开的流,默认全缓冲。

2:在定义文件指针时,要将文件指针指向空;如 FILE *fp = NULL;

3:文件操作完成后,需要将文件关闭,否则会造成文件所占用内存泄漏和在下次访问文件时出现问题。

freopen函数

函数原型:FILE *freopen(const char *filename, const char *mode, FILE *stream);

函数描述:把一个新的文件名 filename 与给定的打开的流 stream 关联,同时关闭流中的旧文件。

函数返回:如果文件成功打开,则函数返回一个指针,指向用于标识流的对象。否则,返回空指针。

特点:

1:关于mode,参考fopen。

2:该函数常用于重定向stdin,stdout,stderr流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。

3:使用该函数在输入输出流间进行反复的重定向时,极有可能导致流指针得到不被期待的结果,使输入输出发生异常,所以如果需要在文件的输入输出和标准输入输出流之间进行切换,建议使用fopen或者是C++标准的ifstream及ofstream。

setbuf函数

函数原型:void setbuf(FILE *stream, char *buffer );

函数描述:定义流 stream 应如何缓冲。

buffer:这是分配给用户的缓冲,它的长度至少为 BUFSIZ 字节。

函数返回:该函数无返回。

特点:

1:该函数应在与流 stream 相关的文件被打开时,且还未发生任何输入或输出操作之前被调用一次。

2:若buffer不为null,表示以全缓冲的方式执行流操作;若buffer为null,表示不缓冲。

setvbuf函数

函数原型:int setvbuf(FILE *stream, char *buffer, int mode, size_t size);

函数描述:定义流 stream 应如何缓冲。允许定义流的缓冲方式及缓冲大小。

函数返回:如果成功,则该函数返回 0,否则返回非零值。

特点:

1:关于mode

模式 描述

_IOFBF 全缓冲:对于输出,数据在缓冲填满时被一次性写入。对于输入,缓冲会在请求输入且缓冲为空时被填充。

_IOLBF 行缓冲:对于输出,数据在遇到换行符或者在缓冲填满时被写入,具体视情况而定。对于输入,缓冲会在请求输入且缓冲为空时被填充,直到遇到下一个换行符。

_IONBF 无缓冲:不使用缓冲。每个 I/O 操作都被即时写入。buffer 和 size 参数被忽略。

2:如果buffer为null,该函数会自动分配一个指定大小的缓冲

3:该函数应在与流 stream 相关的文件被打开时,且还未发生任何输入或输出操作之前被调用一次。

格式化输入输出函数:

fprintf函数

函数原型:int fprintf(FILE *stream, const char *format, …) ;

函数描述:发送格式化输出到流 stream 中。

函数返回:如果成功,则返回写入的字符总数,否则返回一个负数。

特点:

1:关于format

format格式:%[flags][width][.precision][length]specifier

对于specifier可见下表:

格式字符意义
d以十进制形式输出带符号整数(正数不输出符号)
o以八进制形式输出无符号整数
x/X以十六进制形式输出无符号整数(大小写X分别表示输出字符大小写)
u以十进制形式输出无符号整数
lu以十进制形式输出无符号长整型(time_t类型)
f以小数形式输出单、双精度实数
e,E以指数形式输出单、双精度实数
g,G以%f 或%e 中较短的输出宽度输出单、双精度实数
c输出单个字符
s输出字符串
p输出指针地址
%输出一个字符
对于flags、width、precision、length等,在使用时可查阅。

fscanf函数

函数原型:int fscanf ( FILE * stream, const char * format, … );

函数描述:按照某种格式从流中读取字符

函数返回:如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

特点:

1:对于format,参考fprintf

2:要读入的字符必须已经存在,且字符的类型要与format一致。

printf函数

函数原型:int printf(const char *format, …);

函数描述:发送格式化输出到标准输出。

函数返回:如果成功,则返回写入的字符总数,否则返回一个负数。

1:对于format,参考fprintf

scanf函数

函数原型:int scanf(const char *format, …) ;

函数描述:从标准输入stdin读取格式化输入。

函数返回:如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

特点:

1:对于format,参考fprintf

2:要读入的字符必须已经存在,且字符的类型要与format一致。

snprintf函数

函数原型:int snprintf ( char * s, size_t n, const char * format, … );

函数描述:将一定长度(n字符)的数据按某种格式写入字符串。

函数返回:若写入成功,返回欲写入的字符数。若写入出错,返回一个负值。

特点:

1:只有当返回值是一个非负值且小于n是,才能确保数据全部写入到字符串s中,且会在字符串最后加上’\0’。

2:若格式化后的字符串长度大于等于n,则只将其中的size-1个字符复制到s中,并在其最后加上’\0’。

3:返回值为欲写入的字符串长度(不包括最后的’\0’),而不是成功写入的字符数。

4:相较于sprintf,snprintf更安全。

sprintf函数

函数原型:int sprintf(char *str, const char *format, …) ;

函数描述:发送格式化输出到str所指向的字符串。

函数返回:如果成功,则返回成功写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。

特点:

1:str的存储空间应该足够大,以使得全部数据都能写入。若空间不够大,可能有溢出的风险。

2:函数会自动在字符串的最后加上’\0’。

sscanf函数

函数原型:int sscanf(const char *str, const char *format, …);

函数描述:从字符串读取格式化输入。

函数返回:如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

特点:

1:* 亦可用于格式中, (即 %d 和 %*s) 加了星号 表示跳过此数据不读入。

2:其他种类的format在用到时可上网查阅。

vfprintf函数

函数原型:int vfprintf(FILE *stream, const char *format, va_list arg);

函数描述:使用参数列表发送格式化输出到流stream中。

函数返回:如果成功,则返回写入的字符总数,否则返回一个负数。

vfscanf函数

函数原型:int vfscanf ( FILE * stream, const char * format, va_list arg );

函数描述:使用参数列表发送格式化输入到流stream中。

函数返回:如果成功,则返回读取的字符总数,否则返回一个负数。

vprintf函数

函数原型:int vprintf(const char *format, va_list arg);

函数描述:使用参数列表发送格式化输出到标准输出stdout。

函数返回:如果成功,则返回写入的字符总数,否则返回一个负数。

vsprintf函数

函数原型:int vsprintf(char *str, const char *format, …);

函数描述:使用参数列表发送格式化输出到字符串。

函数返回:如果成功,则返回写入的字符总数,否则返回一个负数。

另有vscanf,vsscanf,vsnprintf等函数。在使用时,可以查阅参考。

字符输入输出类函数

fgetc函数

函数原型:int fgetc(FILE *stream);

函数描述:从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。

函数返回:该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

特点:

1:该函数与getc函数等价,除了getc函数可在某些库里作为宏使用。

补充:为何fgetc函数(包括getc、getchar以及fputc、putc、putchar)会返回一个int型?原因是为了允许函数报告函数的末尾(EOF)。因为EOF被定义为一个整型,它的值在任何可能出现的字符范围之外。

fgets函数

函数原型:char *fgets(char *str, int n, FILE *stream);

函数描述:从指定的流stream读取一行,并把它存储在str所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

函数返回:如果成功,该函数返回相同的str参数。如果到达文件末尾或者没有读取到任何字符,str的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。

特点:

1:n是要读取的最大字符数(包括最后的空字符)。

2:函数会自动在str字符串的最后加上’\0’。

3:一个换行符会终止该函数,但是该函数会认为换行符是有效字符,会读进str中。

fputc函数

函数原型:int fputc(int char, FILE *stream);

函数描述:把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。

函数返回:如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。

fputs函数

函数原型:int fputs(const char *str, FILE *stream);

函数描述:把字符串写入到指定的流stream中,但不包括空字符。

函数返回:该函数返回一个非负值,如果发生错误则返回EOF。

特点:

1:fputs与puts的不同,不仅在于fputs可以指定一个流,而且fputs不会写入额外的字符,而puts会在流结尾自动添加一个换行符。

getc函数

函数原型:int getc(FILE *stream);

函数描述:从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。

函数返回:该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

getchar函数

函数原型:int getchar(void);

函数描述:从标准输入stdin获取一个字符(一个无符号字符)。这等同于 getc以 stdin 作为参数。

函数返回:该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

gets函数

函数原型:char *gets(char *str);

函数描述:从标准输入 stdin 读取一行,并把它存储在 str 所指向的字符串中。当读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

函数返回:如果成功,该函数返回 str。如果发生错误或者到达文件末尾时还未读取任何字符,则返回 NULL。

特点:

1:函数会自动在str字符串的最后加上’\0’。

2:与fgets不同,gets不会读取换行符。

putc函数

函数原型:int putc(int char, FILE *stream);

函数描述:把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。

函数返回:该函数以无符号char强制转换为int的形式返回写入的字符,如果发生错误则返回EOF。

特点:

1:改函数与fputc函数等价,除了该函数可以作为某些库的宏外。

putchar函数

函数原型:int putchar(int char);

函数描述:把参数char指定的字符(一个无符号字符)写入到标准输出 stdout 中。

函数返回:该函数以无符号char强制转换为int的形式返回写入的字符,如果发生错误则返回EOF。

puts函数

函数原型:int puts(const char *str);

函数描述:把一个字符串写入到标准输出 stdout,直到空字符,但不包括空字符。换行符会被追加到输出中。

函数返回:如果成功,该函数返回一个非负值,如果发生错误则返回 EOF。

ungetc函数

函数原型:int ungetc(int char, FILE *stream);

函数描述:把字符 char(一个无符号字符)推入到指定的流 stream 中,以便它是下一个被读取到的字符。

函数返回:如果成功,则返回被推入的字符,否则返回EOF,且流stream保持不变。

特点:

1:stream必须是输入流而不能是输出流。

2:该函数常用语字符串中对某个字符的替换。

3:若对流进行fseek,rewind等操作,会使得流丢弃所有该函数推入的字符。

直接读取函数(二进制IO)

fread函数

函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

函数描述:从给定流stream读取数据到ptr所指向的数组中。size表示每个字符的大小,nmemb表示读取的字符总数。

函数返回:成功读取的元素总数会以 size_t 对象返回,如果返回值与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾(分别返回ferror和feof)。

fwrite函数

函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

函数描述:把ptr所指向的数组中的数据写入到给定流stream中。

函数返回:如果成功,该函数返回一个 size_t 对象,表示元素的总数。如果该数字与 nmemb 参数不同,则会显示一个错误。

文件定位函数

fgetpos函数

函数原型:int fgetpos(FILE *stream, fpos_t *pos);

函数描述:获取流stream的当前文件位置,并把它写入到pos。

函数返回:如果成功,该函数返回零。如果发生错误,则返回非零值。

fseek函数

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

函数描述:设置流stream的文件位置为给定的偏移offset,参offset意味着从给定的whence 位置查找的字节数。

函数返回:如果成功,则该函数返回零,否则返回非零值。

特点:

1:whence表示开始添加偏移的位置,通常它指3个常量,分别是SEEK_SET,SEEK_CUR,SEEK_END。

fsetpos函数

函数原型:int fsetpos(FILE *stream, const fpos_t *pos);

函数描述:设置给定流stream的文件位置为给定的位置。参数pos是由函数fgetpos给定的位置。

函数返回:如果成功,该函数返回零值,否则返回非零值。

特点:

ftell函数

函数原型:long int ftell(FILE *stream);

函数描述:返回给定流stream的当前文件位置。

函数返回:该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。

特点:

1:若流为二进制流,返回值表示距离流开始的字节数。

rewind函数

函数原型:void rewind(FILE *stream);

函数描述:设置文件位置为给定流stream的文件的开头。

函数返回:无返回。

错误处理函数

clearerr函数

函数原型:void clearerr(FILE *stream);

函数描述:清除给定流 stream 的文件结束和错误标识符。

函数返回:这不会失败,且不会设置外部变量 errno,但是如果它检测到它的参数不是一个有效的流,则返回 -1,并设置 errno 为 EBADF。

feof函数

函数原型:int feof(FILE *stream);

函数描述:测试给定流 stream 的文件结束标识符。

函数返回:当到达文件结尾时,返回非零,否则返回零。

ferror函数

函数原型:int ferror(FILE *stream);

函数描述:测试给定流 stream 的错误标识符。

函数返回:如果设置了与流关联的错误标识符,该函数返回一个非零值,否则返回一个零值。即出错返回非零,没出错返回零。

perror函数

函数原型:void perror(const char *str);

函数描述:把一个描述性错误消息输出到标准错误 stderr。首先输出字符串 str,后跟一个冒号,然后是一个空格。

函数返回:无返回。

参考:

1:http://www.runoob.com/cprogramming/c-standard-library-stdio-h.html

2:http://www.cplusplus.com/reference/cstdio/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息