1.标准 I/O库
1.1 函数fwide
fwide函数可用于设置流的定向。
#include<stdio.h>
#include<wchar.h>
int fwide(FILE*fp,int mode);//1.已经打开的文件流 2.mode 操作选项
1.如若mode参数的值为负数,则指定的流将设置为字节定向的.
2.如若mode参数的值为正,fwide将试图使指定的流是宽定向的.
3.如若mode参数的值为0,fwide将不视图设置流定向的,但返回该对象的流设置.
1.2 标准输入和标准输出标准错误流
#include<stdio.h>
STDIN_FILENO //标准输入
STDOUT_FILENO //标准输出
STDERR_FILENO //标准错误
1.3 设置缓存模式 setbuf和setvbuf
下面两个函数用来设置缓存模式
#inclde<stdio,h>
void setbuf(FILE* res
trict fp,char *restrict buf);//1.fp 已经打开的流 2.buf 缓存区其长度为 BUFSIZE
int setvbuf(FILE* restrict fp,char *restrict buf,int mode,size_t size);//1.fp 已经打开的流 2.buf 缓存区长度
3.mode 具体的缓存模式 4.size 缓存区长度
1.关于mode的参数设置 主要有 IOFBF全缓冲, IOLBF 行缓冲 ,_IONBF 不带缓冲
1.4 刷新缓存区
#include<stdio.h>
int fflush(FILE *fp);
1.使用该函数将强制将缓存区数据写入到内核.
1.5 打开流 和关闭流
#include<stdio.h>
FILE *fopen(const char*restrict pathname,const char*restrict type);
FILE *freopen(const char*restrict pathname,const char*restrict type,FILE *restrict fp);
FILE *fdopen(int fd,const char*type);
1.fopen函数打开路径名为pathname的文件
2.freopen函数在一个指定流上打开一个指定文件。如果该流已经打开,则先关闭该流。此文件一般用于将一个指定文件打开为一个预定义的流:标准输入或者标准输出。
3.fdopen函数取一个已经打开的文件描述符。
调用下面函数将关闭一个流.
#include<stdio.h>
int fclose(FILE *fp);
1.6 读和写流
下面函数可用于一次读取一个字符
#include<stdio.h>
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);
int ferror(FILE *fp);
int feof(FILE *fp);
void clearerr(FILE *fp);
1.函数getchar等同于getc(stdin)。前两个函数的区别是,getc可以被实现为宏,fgetc不可用实现为宏。
2.不管是出错还是到达文件尾部,这三个函数都返回相同的值。为了区分必须调用函数 ferror和feof函数。如果为真则返回非0
3.大多实现都为每个流在FILE对象中维护了两个标志.出错标志和文件结束标志,调用函数clearerr可以清楚标志。
#include<stdio.h>
int ungetc(int c,FILE *fp);
1.调用函数ungetc可以把一个字符压入会流中。只是压入会内存,并不会更改硬盘中的文件内容。
#include<stdio.h>
int putc(int c,FILE*fp);
int fputc(int c,FILE *fp);
int putchar(int c);
1.与输入函数一样,putchar©与putc()相同。并且putc可以被实现为宏而fptuc函数不能实现为宏。
1.7 每次一行I/O
下面函数提供每次输入一行的功能
#include<stdio.h>
char *fgets(char *restrict buf,int n,FILE *restrict fp);
char *gets(char *buf);
若成功返回buf,若出错或者到达文件尾端,返回NULL。
1.fgets 从fp流中读取一行字符,并且以null字符结束。此函数一直读取到下一个换行符为止,若加上换行符的长度大于n-1,则返回一个不完整的行,并且下一次调用还会从读取
下面函数提供每次输出一行的功能
#include<stdio.h>
int fputs(const char*restrict str,FILE *restrict fp);
int puts(const char *str);
1.函数fputs将以null字节终止的字符串写入到指定的流,尾端的终止符号null不写出。
2.注意这并不是每次输出一行,因为字符串不需要换行符最为最后一个非null字符。同在是一个换行符,但不总要求如此。
3.函数puts将一个以null字符终止的字符串写入到标准输出,终止符不写出。但是puts随后又将一个换行符写到biao’zhun
1.8 二进制I/O
下面函数可用用来读写二进制数据
#include<stdio.h>
size_t fread(void *restruct ptr,size_t size,size_t nobj,FILE *restrict fp);
size_t fwrite(const void*restruct ptr,size_t size,size_t nobj,FILE *restrict fp);
1.nobj为元素的个数 size为单个元素的大小。
1.9 定位流
#include<stdio.h>
long ftell(FILE *fp);
int fseek(FILE *fp,long offset,int whence);
void rewind(FILE *fp);
off_t ftello(FILE *fp);
int fseeko(FILE *fp,off_t offset,int whence);
1.ftell 返回当前文件的偏移量,类型为long.若失败返回-1L
2.fseek 设置当前的文件偏移量,whence与lseek设置相同,用来设置文件的偏移方式
3.rewind 函数使一个文件的偏移量回到起始位置.
4.除了off_t和long 类型不同外,ftello和fseeko与ftell和fseek函数作用相同
下面两个函数是iso c提供的。
#include<stdio.h>
int fgetpos(FILE *restrict fp,fpos_t *restrict pos);
int fsetpos(FILE *fp,const fpos_t *pos);
1.fgetpos函数将文件位置指示器的当前值存入由pos指向的对象中.
2.后续调用fsetpos函数可用设置文件的偏移量
1.10 获取文件描述符 fileno
下面函数获取一个标准IO文件的文件描述符fd
#include<stdio.h>
int fileno(FILE *fp);
1.fileno函数返回与该流相关联的文件描述符
1.11 临时文件
b标准isoc提供了两个函数帮助创建临时文件
#include<stdio.h>
char *tmpnam(char *ptr);//1.ptr 临时文件名字返回
//返回值:指向唯一的路径名的指针
FILE *tmpfile(void);
//返回值:若成功,返回文件指针;若出错,返回NULL
1.tmpnam函数产生一个与现有文件名不同的一个有效路径名字符串。
2.tmpfile函数创建一个临时的二进制文件,进程关闭后会删除该文件.
下面两个函数,用来创建目录和文件
#include<stdlib.h>
char *mkdtemp(char *template);
//返回值:若成功,返回指向目录名的字符串指针,出错返回NULL
int mkstemp(char *template);
//返回值:诺成功,返回文件描述符,若出错返回-1
1.两个函数的名字是通过template这个参数选择的,这个字符串的后六位设置位XXXXXX,函数将根据这个字符串,构建一个唯一的路径名。
1.12 内存流
fmemopen
是一个在 C 语言中用于处理内存缓冲区的文件流操作的函数。这个函数将一个内存块转换为一个 “文件流”,允许你使用标准的 C I/O 函数(如 fread
、fwrite
、fseek
等)来读取或写入该内存块,就像操作一个文件一样。
以下是 fmemopen
的详细说明:
#include <stdio.h>
FILE *fmemopen(void *buf, size_t size, const char *mode);//1.指向一块自定义的缓存 2.指定缓存大小 3.模式
//若成功,返回流指针,若失败返回null
type | 说明 |
---|---|
r或rb | 为读而打开 |
w或wb | 为写而打开 |
a或ab | 追加,为在第一个null字节处写而打开 |
r+或r+b或rb+ | 为读和写而打开 |
w+或w+b或wb+ | 把文件截断至0,为读和写打开 |
a+或a+b或者ab+ | 追加,为在第一个null字节处读和写而打开 |
- 内存管理:如果
buf
是NULL
,则fmemopen
会分配内存。在这种情况下,你应该在不再需要文件流时,使用fclose
来关闭它,以释放分配的内存。如果buf
不是NULL
,则你负责管理这块内存的生命周期。- 模式限制:在
"w"
或"w+"
模式下,fmemopen
不会清除或初始化提供的缓冲区。它只会从缓冲区的开始位置写入数据。如果缓冲区中已经有数据,这些数据可能会被新写入的数据覆盖。- 线程安全:虽然
fmemopen
在某些系统上可能是线程安全的,但它通常并不保证这一点。如果你在多线程环境中使用它,并且多个线程可能同时访问同一个FILE
对象,你需要自己实现适当的同步机制。- 可移植性:
fmemopen
并不是 C 标准库的一部分,因此它的可用性取决于具体的平台和编译器。在一些系统上,你可能需要包含特定的头文件或 使用特定的编译器标志来启用它。