错误报告函数
strerror
返回错误码errno所对应的错误信息。标准库函数提供了一个全局变量erron(在头文件errno.h中定义),记录错误的信息,提示错误的原因
用法:
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
int main()
{
int *p = (int *)malloc(INT_MAX);
if (p == NULL)
{
printf("%s\n", strerror(errno));
}
free(p);
p = NULL;
return 0;
}
perror
void perror(const char *str)
perror以一种简单、统一的方式报告错误
用法:
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
int main()
{
int *p = (int *)malloc(INT_MAX);
if (p == NULL)
{
perror("use malloc");
}
free(p);
p = NULL;
return 0;
}
终止执行函数
void exit(int status)
exit函数由于终止一个程序,定义在头文件stdlib.h
中,EXIT_SUCCESS
()和EXIT_FAILURE
分别表示成功返回和失败返回,加入在上述的例子中,内存开辟失败自然要进行失败返回
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
int main()
{
int *p = (int *)malloc(INT_MAX);
if (p == NULL)
{
perror("use malloc");
exit(EXIT_FAILURE);
}
free(p);
p = NULL;
return 0;
}
宏定义的状态值:
EXIT_SUCCESS 0
EXIT_FAILURE 1
文件
在stdio中定义了一个FLIE数据结构,用于维护一个流。对于一个标准c程序,编译器默认至少打开是哪个流:每一个流都是指向FILE结构的指针
- 标准输入流(stdin)
- 标准输出流(stdout)
- 标准错误流(stderr)
IO常量
- EOF–文件结束标志,表示文件到了结尾
- FOPEN_MAX–一个程序最多打开文件数(20)
- FTLENAME_MAX–文件名的最大长度(260)
打开流函数
FILE *fopen(const char *filename,const char *mode)
mode:
- “r”:打开一个已有的文本文件,允许读取文件。
- “w”:打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
- “a”:打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
- “a+”:打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。
关闭流函数
int fclose(FILE *stream)
当打开一个流的时候,操作完成主动将流关闭,以便于其他进程使用
IO函数
单个字符操作函数
字符输入函数 getchar 标准输入流
字符输入函数 putchar 标准输出流
字符输入函数 fgetc,getc 所有输入流
字符输出函数 fputc,putc 所有输出流
getchar、putchar
int ch = 0;
ch = getchar();//stdin
putchar(ch);//stdout
fgetc、getc、fputc、putc
#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
int ch = 0;
FILE *pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("use fopen");
exit(EXIT_FAILURE);
}
//"写操作"--"w"
fputc('b', pf);
//"读操作"--"r"
ch=fgetc(pf);
putchar(ch);
fclose(pf);
pf =NULL;
return 0;
}
文本操作函数
文本输入函数 fgets、gets 所有输入流
文本输出函数 fputs、puts 所有输出流
fgets、gets、fputs、puts
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
int main()
{
char arr[10] = { 0 };
FILE *pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("use fopen");
exit(EXIT_FAILURE);
}
//"写操作"--"w"
fputs("hello\n",pf);
fputs("world\n", pf);
//"读操作"--"r"
fgets(arr,10,pf);
printf("%s", arr);
fclose(pf);
pf = NULL;
return 0;
}
格式化操作函数
格式化输入函数 scanf 标准输入流
格式化输出函数 printf 标准输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
格式化输入函数 sscanf 所有输入流
格式化输出函数 sprintf 所有输入流
fscanf、fprintf
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
int main()
{
char arr[10] = { 0 };
int n = 0;
char ch = 0;
FILE *pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("use fopen");
exit(EXIT_FAILURE);
}
//"写操作"--"w",从标准输出流中读入,在写到pf维护的流中
fscanf(stdin, "%s %d %c", arr, &n, &ch);
fprintf(pf, "%s %d %c", arr, n, ch);
//"读操作"--"r",从pf维护的流读出来,写到标准输出流中
fscanf(pf, "%s %d %c", arr, &n, &ch);
fprintf(stdout, "%s %d %c", arr, n, ch);
fclose(pf);
pf = NULL;
return 0;
}
sprintf、sscanf
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
struct S
{
char name[20];
int age;
float width;
};
int main()
{
struct S stu = { "zhangsan", 20, 290.0f };
struct S tmp;
char buf[100] = { 0 };
//sprintf是将一些数据按照格式化写到一个字符串中
sprintf(buf, "%s %d %f", stu.name, stu.age, stu.width);
//sscanf是从一个字符串中格式化读出来数据
sscanf(buf, "%s %d %f", tmp.name, &tmp.age, &tmp.width);
return 0;
}
二进制操作函数
二进制输入 fread 文件
二进制输出 fwrite 文件
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
struct S
{
char name[20];
int age;
float width;
};
int main()
{
struct S stu = { "zhangsan", 20, 290.0f };
FILE *pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("use fopen");
}
//"写一个二进制的文件"--"w"
fwrite(&stu, sizeof(struct S), 1, pf);
//"读一个二进制的文件"--"r"
fread(&stu, sizeof(struct S), 1,pf);
printf("%s %d %f", stu.name, stu.age, stu.width);
fclose(pf);
return 0;
}
其他常见函数
- fflush
刷新缓冲区
- ftell
用于得到文件位置指针当前位置相对于文件首的偏移字节数
fseek
int fseek(FILE *stream, long offset, int fromwhere);
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset取值大于等于2 * 1024 * 1024 * 1024,即long的正数范围2G),则不改变stream指向的位置,函数返回一个非0值
setbuf
void setbuf(FILE *steam, char *buf);
把缓冲区与流相联
- setvbuf
int setvbuf(FILE *stream, char *buf, int type, unsigned size);
参数:stream :指向流的指针
buf:期望缓冲区的地址
type:期望缓冲区的类型
_IOFBF(满缓冲:当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数据。
_IOLBF(行缓冲:每次从流中读入一行数据或向流中写入一行数据。
_IONBF(无缓冲:直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
size:缓冲区内字节的数量。
功 能: 把缓冲区与流相关
- fgetpos
int fgetpos(FILE * restrict stream,fpos_t * restrict pos);
在pos所指的位置放置一个fpos_t值,这个值描述了文件中的一个位置。返回值:如果成功,函数返回0;否则返回一个非零值。
- fsetpos
int fsetpos(FILE *stream, const fpos_t *pos);
将文件指针定位在pos指定的位置上。该函数的功能与前面提到的fgetpos相反,是将文件指针fp按照pos指定的位置在文件中定位。pos值以内部格式存储,仅由fgetpos和fsetpos使用。
- rewind
将文件内部的指针重新指向一个流的开头
- feof
int feof(FILE *stream);
检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除。
- ferror
int ferror(FILE *stream);
ferror,函数名,在调用各种输入输出函数(如 putc.getc.fread.fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。 它的一般调用形式为 ferror(fp);如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。应该注意,对同一个文件 每一次调用输入输出函数,均产生一个新的ferror函 数值,因此,应当在调用一个输入输出函数后立即检 查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。
- clearerr
void clearerr(FILE *stream);
clearerr的作用是使文件错误标志和文件结束标志置为0.假设在调用一个输入输出函数时出现了错误,ferror函数值为一个非零值。在调用clearerr(fp)后,ferror(fp)的值变为0。
- tmpfile
tmpfile是一种函数,功能是以wb+形式创建一个临时二进制文件
- remove
删除一个文件
- rename
文件重命名