C语言编程标准I/O库

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将不试图设置流的定向,但返回标识该流定向的值、

缓冲

  1. 全缓冲

    malloc(),fflush()

  2. 行缓冲

    fputc()

  3. 无缓冲

    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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值