C语言编程
标准I/O库
标准I/O可应用于不同操作系统,不仅在Unix系统,其它系统也实现了I/O库
流和FILE对象
#include<stdio.h>
#include<wchar.h>
int fwide(FILE *fp, int mode);
//返回值:若流是宽定向的,返回正值;若流是字节定向的,返回负值;若流是未定向的,返回 0
fwide设置一个流的定向
根据moded参数的值不同,fwide执行不同的工作
- mode = 负值 。fwide将试图使指向的流是字节定向的
- mode = 正值。 fwide将试图使指向定的流是宽定向的
- mode = 0 。 fwide将不试图设置流的定向,但返回标识该流定向的值、
缓冲
-
全缓冲
malloc(),fflush()
-
行缓冲
fputc()
-
无缓冲
fputs()
#include<stdio.h>
void setbuf(FILE *restrict fp, char *restrict buf);
int setvbuf(FILE *restrict fp, char *buf, int mode , size_t size);
//返回值:若成功,返回 1;若出错,返回 -1
参数 buf 为一个长度为BUFFSIZE的缓冲区
setvbuf的mode参数
- _IOFBF 全缓冲
- _IOLBF 行缓冲
- _IONBF 无缓冲
#include<stdio.h>
int fflush(FILE *fp); //返回值:若成功,返回 0;若出错,返回 -1
fflush使流所有为写的数据传送至内核,
若fp=NULL,所有输出流被冲洗
打开流
#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);
//返回值:若成功,返回文件指针;若出错,返回 NULL
type | 说明 | open标志 |
---|---|---|
r或rb | 为读而打开 | O_RDONLY |
w或wb | 把文件长度截至0,或为写而创建 | O_WRONLY|O_CREAT|O_TRUNC |
a或ab | 追加;为在文件尾写而打开,或为写而创建 | O_WRDONLY|O_CREAT|O_APPEND |
r+或r+b或rb+ | 为读和写而打开 | O_RDWR |
w+或w+b或wb+ | 把文件截断为0长度,或为读和写而打开 | O_RDWR|O_CREAT|O_TRUNC |
a+或a+b或ab+ | 为在文件尾读和写而打开或创建 | O_RDWR|O_CREEAT|O_APPEND |
#include<stdio.h>
int fclose(FILE *fp); //返回值:若成功,返回 0;若出错,返回 -1
读和写流
输入函数
每次读一个字符
#include<stdio.h>
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(voiid);
//返回值:若成功,返回下一个字符;若已达到文件尾端或出错,返回 EOF
#include<stdio.h>
int ferror(FILE *fp);
int feof(FILE *fp);
//返回值:若条件为真,返回 非0(真);否则,返回 0(假)
void clearerr(FILE *fp);
#include<stdio.h>
int ungetc(int c,FILE* fp);
//返回值:若成功,返回 c;若出错,返回 EOF
输出函数
与输入函数一一对应
#include<stdio.h>
int putc(int c, FILE *fp);
int fputc(int c , FILE* fp);
int putchar(int c);
//返回值:若成功,返回 c;若出错,返回 -1
每次一行I/O
/* 输入 */
#include<stdio.h>
char *fgets(char *restrict buf, int n, FILE *restrict fp);
char *gets(char *buf);
/*返回值:若成功,返回 buf;若已到达文件尾端或出错,返回 NULL*/
/* 输出 */
#include<stdio.h>
int fputs(const char *restrict str, FILE *restrict fp);
int puts(const char *str);
/*返回值:若成功,返回非负值;若出错,返回EOF*/
二进制I/O
#include<stdio.h>
size_t fread(void *restrict ptr , size_t size,size_t nobj, FILE *restrict fp);
size_t fwrrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
/*返回值:读或写的对象数*/
size:为结构或者元素长度
nobj:要写的对象个数,或者要写的元素个数
/*例1*/
float data[10];
if(fwrite(&data[2],sizeof(float),4,fp) != 4 )
err_sys("fwrite error");
/*例2*/ //读写一个二进制数组
struct { //读写一个结构
short count;
long total;
char name[MAXLINE];
}items;
if(fwrite(&items,sizeof(items),1,fp) != 1)
err_sys("fwrite error");
定位流
#include<stdio.h>
long ftell(FILE *fp);
//返回值:若成功,返回当前文件的位置指示;若出错,返回 -1L
int fseek(FILE *fp, long offset, int whence);//参数whence与lseek()相同 3.6
//返回值:若成功,返回 0;若出错,返回 -1
void rewind(FILE *fp);
#include<stdio.h>
off_t ftello(FILE *fp);
//返回值:若成功,返回当前文件位置;若出错,返回 (off_t)-1
int fseeko(FILE *fp, off_t offset, int whence);
//返回值:若成功,返回 0;若出错,返回 -1
#iinclude<stdio.h> //需要移植到非UNIX系统,使用 fgetpos(),fsetpos()
int fgetpos(FILE *restrict fp, fpots_t *restrict pos );
int fsetpos(FILE* fp,const fpos_t pos);
//返回值:若成功,返回 0;若出错,返回 非0
格式化I/O
格式化输出
#include<stdio.h>
int printf(const char *restrict format , . . .);
int fprintf(FILE *restrict fp, const char * restrict format , . . .);
int dprintf(int fd, const char *restrict format, . . . );
返回值:若成功,返回输出字符串;若出错,返回负值
int sprintf(char *restrict buf,const char *restrict format, . . .);
返回值:若成功,返回会存入数组的字符串;若编码出错,返回复值
int snprintf(char *restrict buf, size_t n, const char *restrict format, . . . );
返回值:若缓冲区足够大,返回将存入数组的字符数;若编码出错,返回负值
printf()将格式化数据写道标准输出
fprintf()将数据写入指定的流
dprintf()写入指定的文件
sprintf()将格式化的字符送入数组buf中,会在结尾添加null,但返回值不包含添加的null,可能产生缓冲区溢出
snprintf()参数size,设定缓冲区大小,安全
#include<sedarg.h>
#include<stdio.h>
int vprintf(const char *restrict format, va_list arg);
int vfprintf(FILE *restrict fp, const char *restrict format, va_list arg);
int vdprintf(int fd, const char *restrict format, va_list arg);
返回值:若成功,返回输出字符串;若出错,返回负值
int vsprintf(char *restrict buf,const char *restrrict format, va_list arg);
返回值:若成功,返回存入数组的字符数;若编码出错,返回负值
int vsnprintf(char *restrict buf, size_t size , const char *reestrict format,va_list arg);
返回值:若缓冲区足够大,返回存入数组的字符串;若编码出错,返回负值
格式化输入
#include<stdio.h>
int scanf(const char *restrict format, . . . );
int fscanf(FILE *restrict fp,const char *restrict format, . . . );
int sscanf(const char *restrict buf, const char *restrict format, . . . );
返回值:若成功,返回 赋值的输入项数;若输入出错或在任意转换前已达到文件尾端,返回 EOF
#include<stdio.h>
int vsscanf(const char *restrict format, va_list arg );
int vsfscanf(FILE *restrict fp,const char *restrict format,va_list arg );
int vsscanf(const char *restrict buf, const char *restrict format, va_list arg );
返回值:若成功,返回 赋值的输入项数;若输入出错或在任意转换前已达到文件尾端,返回 EOF
Other
#include<stdio.h>
int fileno(FILE *fp);
返回值:返回与该流相关联的文件描述符
临时文件
#include<stdio.h>
char *tmpnam(char *ptr);
返回值:指向唯一路径名的指针
FILE *tmpfile(void);
返回值:若成功,返回 文件指针;若出错,返回 NULL
/*tmpnam例子*/
char name[names];
tmpnam(name);
或者
name=tmpnam(NULL);
#include<stdlib.h>
char *mkdtemp(char *template);
返回值:若成功,返回指向目录名的指针;若出错,返回 NULL
int mkstemp(char *template);
返回值:若成功,返回文件描述符;若出错,返回 -1
使用mkdtemp()创建的文件具有 S_IRUSR|S_IWUSR|S_IXUSR ,可用umask()修改屏蔽
使用tmpfile和mkstep函数优于mkdtemp,mkstemp