C标准库——<stdio.h>

227 阅读5分钟

1.0 库变量

  • size_t:这是无符号整数类型,它是 sizeof 关键字的结果。
  • FILE:这是一个适合存储文件流信息的对象类型。
  • fpos_t:这是一个适合存储文件中任何位置的对象类型。 附:FILE结构源码:
    typedef	struct __sFILE {
    unsigned char *_p;	/* current position in (some) buffer */
    int	_r;		/* read space left for getc() */
    int	_w;		/* write space left for putc() */
    short	_flags;		/* flags, below; this FILE is free if 0 */
    short	_file;		/* fileno, if Unix descriptor, else -1 */
    struct	__sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
    int	_lbfsize;	/* 0 or -_bf._size, for inline putc */
    
    /* operations */
    void	*_cookie;	/* cookie passed to io functions */
    int	(* _Nullable _close)(void *);
    int	(* _Nullable _read) (void *, char *, int);
    fpos_t	(* _Nullable _seek) (void *, fpos_t, int);
    int	(* _Nullable _write)(void *, const char *, int);
    
    /* separate buffer for long sequences of ungetc() */
    struct	__sbuf _ub;	/* ungetc buffer */
    struct __sFILEX *_extra; /* additions to FILE to not break ABI */
    int	_ur;		/* saved _r when _r is counting ungetc data */
    
    /* tricks to meet minimum requirements even when malloc() fails */
    unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
    unsigned char _nbuf[1];	/* guarantee a getc() buffer */
    
    /* separate buffer for fgetln() when line crosses buffer boundary */
    struct	__sbuf _lb;	/* buffer for fgetln() */
    
    /* Unix stdio files get aligned to block boundaries on fseek() */
    int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
    fpos_t	_offset;	/* current lseek offset (see WARNING) */
    

} FILE;

- 例:利用文件流指针输出文件流信息
#include <stdio.h>

int main(){
    FILE *st = fopen("/Users/baifeng/CLionProjects/testcode/test2.c","r");
    printf("%d\n",st->_flags);
    fclose(st);
    return 0;

}

1.1库函数:文件操作函数:juejin.cn/post/684490…

  • fflush():int fflush(FILE *stream);会强迫将缓冲区内的数据写回参数stream 指定的文件中。
  • fgetpos():int fgetpos(FILE * restrict stream,fpos_t * restrict pos);功能是依据当前文件的句柄,获取当前访问指针位置信息,其值被存放在fpos_t 中。
  • fsetpos():int fsetpos(FILE *stream, const fpos_t *pos);设置给定流 stream 的文件位置为给定的位置。参数 pos 是由函数 fgetpos 给定的位置。
  • freopen():FILE *freopen(const char *filename, const char *mode, FILE *stream) ;打开新的文件流,关闭旧的文件流。
  • remove():int remove(const char *filename);删除给定的文件名,删除成功返回0,失败返回-1。
  • rename():int rename(const char *old_filename, const char *new_filename),改名文件
  • setbuf:void setbuf(FILE *stream, char *buffer);该函数应在与流 stream 相关的文件被打开时,且还未发生任何输入或输出操作之前被调用一次。参数buf必须指向一个长度为BUFSIZ(定义在stdio.h头文件中)的缓冲区。通常在此之后该流就是全缓冲的.
    实操:
#include <stdio.h>

int main(void)
{
    char outbuf[BUFSIZ];//必须是BUFSIZ,否则存在缓冲溢出可能
    /* 将outbuf与stdout输出流相连接 */
    setbuf(stdout,outbuf);//stdout类似于文件流指针,方便操作输出
    /* 向stdout中放入一些字符串 */
    puts("This is a test of buffered output.");//体现stdout的行缓冲性质
    fprintf(stdout,"hello world.");
    /*刷新流*/
    fflush(stdout);
    /* 以下是outbuf中的内容 */
    puts(outbuf);
    return 0;
    //输出结果:This is a test of buffered output.
    //hello world.This is a test of buffered output.
    //hello world.
}
  • setvbuf:int setvbuf(FILE *stream, char *buffer, int mode, size_t size)
    mode:期望缓存区的类型
    _IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。
    _IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
    _IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。

  • tmpfile(): FILE *tmpfile(void) 以二进制更新模式(wb+)创建临时文件。被创建的临时文件会在流关闭的时候或者在程序终止的时候自动删除。如果成功,该函数返回一个指向被创建的临时文件的流指针。如果文件未被创建,则返回 NULL。

  • tmpnam():char *tmpnam(char *str);产生临时的文件名,str可以是NULL或者一个数组、指针。当sptr为NULL时,返回一个内部静态内存地址(保存了临时文件名),当下一次以NULL调用函数的时候,该内存会被修改。栈地址必须至少有L_tmpnam内存,这样名字保存在那个数组里面,如数组 char buffer [L_tmpnam]。 实操:

#include <stdio.h>

int main()
{
   char buffer[L_tmpnam];
   char *ptr;
   FILE *tmp_f;
   tmp_f=tmpfile()//tmpflie()返回文件指针
   if(tmp_f)
        printf("文件创建成功");
   tmpnam(buffer);//返回值为文件名称
   printf("临时名称 1: %s\n", buffer);
 
   ptr = tmpnam(NULL);
   printf("临时名称 2: %s\n", ptr);

   return(0);
}
  • sprintf():int sprintf(char *str, const char *format, ...):第二个参数及后面的参数以字符串的形式存储到str。

  • vfprintf:int vfprintf(FILE *stream, const char *format, va_list arg);参数arg -- 一个表示可变参数列表的对象。这应被 中定义的 va_start 宏初始化。其他与fprintf相似。

  • vprintf:int vprintf(const char *format, va_list arg);与vfprintf相似,一个输出到文件上,一个输出到终端上。

  • vsprintf: int vsprintf(char *str, const char *format, va_list arg);以列表的形式将字符串存储到str中

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

  • getc:int getc( FILE *stream);从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。

  • puts:int puts(const char *str);把一个字符串写入到标准输出 stdout,直到空字符,但不包括空字符。换行符会被追加到输出中。

  • ungetc:把字符 char(一个无符号字符)推入到指定的流 stream 中,以便它是下一个被读取到的字符。如果成功,则返回被推入的字符,否则返回 EOF,且流 stream 保持不变。

  • perror:void perror(const char *str);把一个描述性错误消息输出到标准错误 stderr。首先输出字符串 str,后跟一个冒号,然后是一个空格。 实操:

#include <stdio.h>
#include <string.h>

int main()
{
   char str1[15];
   char str2[15];
   scanf("%s",str1);
   scanf("%s",str2);

   puts(str1);
   puts(str2);
   
   return(0);
}

参考:百度 C程序设计
未完待续
后续有关输出输入操作代码附上。