您的位置 首页 软件

C规范头文件<stdio.h>

C标准头文件<stdio.h>-似于Windows系统的文件句柄,Unix/Linux系统用来描述文件的一个正整数,OS负责分发文件描述符给程序员,并把关于这个文件细节的控制信息存储在自己的专用内存中,这些信息由OS维护,不需要程序员费心思。

是许多人学C言语触摸的第一个头文件,望文生义,stdio便是”规范输入输出”,其间声明晰一组关于输入输出的类型,宏和函数,其间就包含了打印闻名的”hello,world!”的printf(),可是,这并不意味着这个头文件就很简略,相反,这个头文件是C规范库里唯二一应俱全的一个库(另一个是)。好,让我们从头审视一下这个头文件

概念

文件描绘符file descriptor

似于Windows体系的文件句柄,Unix/Linux体系用来描绘文件的一个正整数,OS担任分发文件描绘符给程序员,并把关于这个文件细节的操控信息存储在自己的专用内存中,这些信息由OS保护,不需要程序员费心思。

文本VS二进制

在ANSI C编程能够指定文件的翻开方法是依照”二进制”仍是”文本”方法,假如在Unix体系这种不差异”文本”和”二进制”的体系中,能够省掉这种指定,可是究竟许多OS仍是对这两种文件类型加以差异的,所以最好仍是进行清晰的指定以便完成可移植性。

流stream

ANSI C将对文件读写看作是数据的流出和流入,而躲藏了文件物理存储介质的不同,即不管这个文件是存储的磁盘,内存,FLASH仍是其他地方,在程序员看来都仅仅一个文件,而对一个文件的处理都是数据的流入和流出。翻开一个文件会把一个物理介质上的文件连接到流的一端。经过流来对实践的文件进行读写,封闭一个文件会把一个物理介质上的文件和流断开。
ANSI C规则了两种流——文本流和二进制流,前者将数据看作字符,即201609是6个字符'2','0','1','6','0','9',占6byte,而在二进制流中,这便是int,占4byte。此外,文本流也会将'\n'转化成'回车CR'和'换行LR'两个字符,而二进制流不会。从这两个视点看,二进制流的活动速度比文本流更快,也更省存储空间

数据类型

size_t

FILE

FILE是ANSIC中用来保存文件信息的一个结构体,运用ANSI C编程时翻开一个文件便是得到的便是一个FILE*(文件指针),假如是运用UNix/Linux体系下的编译器,那么任何经过对FILE*对文件的操作底层都是运用文件描绘符来完成的,当然其他渠道的详细完成还或许不相同

//gcc 4.9.2中对FILE类型的声明typedef struct _IO_FILE FILE;struct _IO_FILE { int _flags; char* _IO_read_ptr; char* _IO_read_end; char* _IO_read_base; char* _IO_write_base; char* _IO_write_ptr; char* _IO_write_end; char* _IO_buf_base; char* _IO_buf_end; char *_IO_save_base; char *_IO_backup_base; char *_IO_save_end; struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; int _flags2; __off_t _old_offset; unsigned short _cur_column; signed char _vtable_offset; char _shortbuf[1]; _IO_lock_t *_lock;# 293 “/usr/include/libio.h” 3 4 __off64_t _offset;# 302 “/usr/include/libio.h” 3 4 void *__pad1; void *__pad2; void *__pad3; void *__pad4; size_t __pad5; int _mode; char _unused2[15 * sizeof (int) – 4 * sizeof (void *) – sizeof (size_t)];};typedef struct _IO_FILE _IO_FILE;

fpos_t

fpos_t能够仅有指定文件中的每个方位所需的一切信息,实践上是一个整型变量,用来记载当时读写方位间隔文件最初的byte数,许多文件读写函数在读写一次后都会改写这个变量的值

NULL

_IOFBF, _IOLBF, _IONBF
这三个宏翻开为具有不同值的常量表达式,是个作为函数setvbuf的第三个arg

BUFSIZ

翻开为一个整型常量表达式,只setbuf()缓冲池的巨细

EOF

End of File,翻开为一个负的整型常量表达式,表明一个流完毕了

FOPEN_MAX

翻开为一个整型常量表达式,表明当时环境下能够一起翻开文件数目的最大数目

FILENAME_MAX

翻开为一个整型常量表达式,表明用来保存文件名的char数组的巨细,即文件名的最大长度

L_tmpnam

翻开为一个整型常量表达式,表明用来保存tmpnam()生成的暂时文件名串的char数组的巨细

SEEK_CUR, SEEK_END, SEEK_SET

翻开为不同值的整型常量表达式,用作fseek()函数的arg

TMP_MAX

翻开为一个整型常量表达式,表明tmpnam()能够声场的独自文件名的最小数目

stderr, stdin, stdout

翻开为一个”FILE*”类型的表达式,别离指向规范过错流,规范输入流,规范输出流,Unix/Linux体系中这三个流默许别离是显示器,键盘,显示器

函数

文件拜访

remove()

/*功用:导致一个文件再也不能经过它的文件名filename拜访,除非从头创立该文件回来值:成功回来0,不然回来非0*/int remove(const char* filename);

rename()

/*功用:把姓名为oldname的文件改名为newname回来值:*/int rename(const char* oldname,const char* newname);

tmpfile()

/*功用:创立一个暂时二进制文件,文件被封闭就会被移除回来值:成功回来FILE*,不然回来void\*FILE* tmpfile(void);

tmpnam()

//生成一个有用的文件名char* tmpnam(char* s);

fclose()

/*功用:将stream指向的流被清空,而且和流相相关的文件被封闭,流中任何未写出的缓冲数据都传递到环境并写入文件,任何未读的都被丢掉。回来值:成功回来0,不然回来EOF*/int fclose(FILE* stream);

fflush()

/*功用:清空stream指向的流,未写入文件的会被写入,未读的丢掉参数:流stream回来值:*/int fflush(FILE* stream);

fopen()

/*功用:翻开以串filename为名的文件,并把这个文件和一个流相连参数:文件姓名符串filename,翻开方法mode如下:r 只读w 清空写a 追加写b 放在rwa之后,表明”以二进制方法”+ 放在rwa之后,表明”文件不存在就创立”回来值:成功回来FILE*,失利回来void**/FILE* fopen(const char* filename,const char* mode);

freopen()

/*功用:打开路径为filename指向的串文件,并把这个文件和流stream相连回来值:成功回来stream的值,不然回来void**/FILE* freopen(const char* filename, const char* mode,FILE* stream);

setvbuf()

/*功用:指定流stream缓冲的方法,只能在流和一个文件相关后,但还没有对流进行其他操作之前运用参数:mode指定流缓冲的方法,_IOFBF表明彻底缓冲,即缓冲区满才对文件操作,_IOLBF表明输入/输出行缓冲,即缓冲区中遇到换行就对文件进行操作,_IONBF表明输入/输出不换冲,假如buf不是void*,则能够用它指向的数组来替代setvbuf()主动分配的缓冲区,size指定了数组的巨细。回来值:成功回来0,不然回来非0; */int setvbuf(FILE* stream, char* buf, int mode, size_t size);

setbuf()

/* 功用:假如buf不是void*,相当于mode为_IOFBF,size为BUFSIZd调用setvbuf(),假如哦buf是void*,相当于mode为_IONBF调用setvbuf()回来值:无*/void setbuf(FILE* stream, char* buf);

格局化输出输出

fprintf()

/*功用:依照format指向的格局操控串把输出写入stream指向的流参数:回来值:成功回来输出项的数目,失利回来EOF*/int fprintf(FILE* stream, const char* format,…);

fscanf()

/*功用:依照format指向的格局操控串,把后边的参数作为指向接纳转化后的输入的目标的指针参数:回来值:成功回来输入项的数目,失利回来EOF*/int fscanf(FILE* stream, const char* format, …);

printf()

/*功用:相当于fprintf(),仅仅把stdout作为stream参数:回来值:成功回来输出项的数目,不然回来负值*/int printf(const char* format, …);

scanf()

/*功用:相当于fsanf(),仅仅把stdin作为stream参数:回来值:成功回来输入项的数目,失利回来EOF*/int scanf(const char* formant, …);

sprintf()

/*功用:相当于fprintf(),仅仅把原本写入流stream的内容改为写入到数组s中参数:回来值:成功写入数组中字符的数目,不包含NUL*/int sprintf(char *s, const char* format, …);

ssanf()

/*功用:相当于fscanf(),仅仅把原本从流stream获取的内容改为从数组s获取参数:回来值:成功输入项的数目,不然回来EOF*/int sscanf(const char* s, const char* format, …);

vfprintf()

/*功用:相当于fprintf(),仅仅把可变参数表用arg替代参数:回来值:成功回来输出项的数目,不然回来一个负数*/int vfprintf(FILE* stream, const char* format, va_list arg);

vprintf()

/*功用:相当于printf(),仅仅把可变参数表用arg替代参数:回来值:成功回来输出项的数目,不然回来一个负数*/int vprintf(const char* format, va_list arg);

vsprintf()

/*功用:相当于sprintf(),仅仅把可变参数用arg替代参数:回来值:成功回来输出项的数目,不然回来一个负数*/int vsprintf(char* s, const char* format, va_list arg);

字符输出输出

fgetc()

/*功用:从stream指向的输入流中读取下一个字符,并把它由unsigned char转化为int参数:回来值:成功回来读取到的字符,不然回来EOF*/int fgetc(FILE* stream);

fgets()

/*功用:从stream指向的流中读取字符,读取字符的数目最多为n-1,由于至少还要给NUL留方位,然后将字符写入到数组s中,假如敲入”123回车”存储的是”123\0″,这个函数会主动把输入的'\n'变成'\0',这点和scanf()不同参数:回来值:*/char* fgets(char* s, int n, FILE* stream);

fputc()

/*功用:把c字符写入到stream指向的输出流中的文件定位符指定的方位,并将方位指针移动一个参数:回来值:*/int fputc(int c, FILE* stream);

fputs()

/*功用:把s串的有用字符写入stream参数:回来值:成功回来一个非负值,不然回来EOF*/int fputs(const char* s, FILE* stream);

getc()

/*功用:相当于fgetc(),仅仅假如getc()作为一个宏完成时,或许会对stream进行屡次进算,所以它的参数不能是有副作用的表达式参数:回来值:*/int getc(FILE* stream);

getchar()

/*功用:相当于fgetc(),仅仅从stream获取改为从stdin获取参数:回来值:*/int getchar(void);

gets()

/*功用:有的材料说相当于fgets(),仅仅从stream获取改为从stdin获取,直到遇到一个换行符,其实gets和fgets最大的差异便是不回进行输入字符数目的约束,一旦用户输入的字符个数超过了接纳buf的巨细,就或许引发过错,所以不主张运用这个函数参数:回来值:*/char* gets(char* s);

putc()

/*功用:相当于fputc(),仅仅假如putc()作为一个宏完成时,或许会对stream进行屡次晕眩,所以它的参数不能是有副作用的表达式参数:回来值:*/int putc(int c, FILE* stream);

putchar()

/*功用:相当于fputc(),仅仅输出到stream改为输出到stdout参数:回来值:*/int putchar(int c);

puts()

/*功用:相当于fputs(),仅仅输出到stream改为输出到stdout参数:回来值:*/int puts(const char* s);

ungetc()

/*功用:把c字符退回到stream参数:回来值:*/int ungetc(int c, FILE* stream);

直接输入输出

fread()

/*功用:从stream中读取最多nmemb个元素到ptr指向的数组中参数:回来值:成功回来读取的元素的个数*/size_t fread(void *ptr, size_t size, size_t nmemb, FILE* stream);

fwrite()

/*功用:从ptr指向的数组中读取最多nmemb个元素并将其写到stream中参数:回来值:*/size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);

文件定位函数

fgetpos()

/*功用:把stream中的定位符的当时值存储到pos指向的目标中参数:回来值:*/int fgetpos(FILE* stream, fpos_t* pos);

fseek()

/*功用:为stream设置文件定位符参数:offset表明以whence为基准的偏移量,whence有三种值:SEEK_SET表明以文件最初为基准,SEEK_CUR表明以当时文件定位符方位为基准,SEEK_END表明以文件结束为基准回来值:成功回来0,不然回来非0*/int fseek(FILE* stream, long int offset, int whence);

fsetpos()

/*功用:依据pos指向的目标的值来设置stream中定位符的方位参数:回来值:成功回来0,不然回来非0,并设置errno*/int fsetpos(FILE* stream, const fpos_t* pos);

ftell()

/*功用:取得stream定位符的当时值参数:回来值:回来文件定位符当时值,不然回来-1L,并设置errno*/long int ftell(FILE* stream);

rewind()

/*功用:把stream的文件定位符设置在文件的开端方位,等价于(void) fseek(stram, 0L,SEEK_SET)参数:回来值:*/void rewind(FILE* stream);

过错处理

clearerr()

/*功用:清空stream指向的流文件完毕符和过错指示符参数:回来值:*/void clearerr(FILE* stream);

feof()

/*功用:测验stream的文件完毕符参数:回来值:假如stream设置了文件完毕符回来一个非0*/int feof(FILE* stream);

ferror()

/*功用:测验stream指向的流的过错提示符参数:回来值:假如stream设置了过错提示符回来非0*/int ferror(FILE* stream);

perror()

/*功用:把errno转化成一个human-readable的信息参数:回来值:*/void perror(const char* s);
 

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/99786.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部