标准IO通过FILE结构体专门用于访问普通文件,通过缓冲机制减少系统调用,实现更高的效率。而文件IO使用文件描述符来访问文件,遵循posix(可移植操作系统接口规范)标准,标准IO是在文件IO之上封装了一个缓冲机制,更上层。
错误处理
#include <errno.h>
extern errno; //错误号
char *strerror(int error);//根据错误号返回对应的错误信息
printf("fopen:%s\n",strerror(errno));
#include <stdio.h>
void perror(const char *s);//先输出字符串再输出错误信息
在我们进行程序开发的时候perror函数能为我们提供错误信息,使用起来非常方便。
fopen、fclose
打开或者关闭流
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
int fclose(FILE *stream);//流关闭时自动刷新缓冲区的数据并释放缓冲区
mode:
r:打开文件,进行读取。
w:创建文件,以进行写入。如果文件已经存在,则删除当前内容。
a:追加,打开或创建文件以在文件尾部写入。
r+: 打开文件以进行更新(读取和写入)。
w+:创建文件以进行更新。如果文件已经存在,则删除当前内容。
a+:追加,打开或者创建文件以进行更新,在文件尾部写入。
使用示例1:
#include <stdio.h>
int main(void)
{
FILE *fp;
if((fp = fopen("test.txt","r")) == NULL){
perror("fopen");return -1;
}
fclose(fp);
return 0;
}
使用示例2:
//测试打开流的最大限制,输出结果为1021
//实际上应该是1024,系统自动打开了stdin,stdout,stderr
#include <stdio.h>
int main(void)
{
int count = 0;
FILE *fp;
while((fp = fopen("test.txt","r")) != NULL){
count++;
}
printf("%d\n",count);
return 0;
}
fgetc、fputc(getchar、putchar)
读写一个字符
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);//从标准输入流中读取字符
return:读到文件末尾返回-1
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
putchar(c) = fputc(c,stdout);//putchar('a') = fputc('a',stdout);
fgets、fputs(gets、puts)
读写一行
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
char *gets(char *s);//容易导致溢出,一般不用
int fputs(const char *s, FILE *stream);
int puts(const char *s);
fwrite、fread
读写若干个对象
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
size:单个对象大小 nmemb:读写对象数量
使用示例1:
//实现文件的复制
//可以使用命令diff -ruN test.txt1 test.txt2 查看两个文件是否相同
#include <stdio.h>
int main(int argc,const char *argv