系统IO:由系统提供,有最基本的操作函数。(简洁、精炼)(类似于菜市场)
好处:简洁单一,稳定,不需要消耗过多系统资源。
缺点:对于功能性要求较高的程序,更加繁琐。
标准IO:由标准C库提供,拥有多样化的操作函数。(功能多样)(类似于饭馆)
好处:复杂操作更为方便,函数接口更加多样化。
缺点:消耗系统资源更多,不适用于简单功能。
——》标准IO,其本质就是调用了系统IO函数,另外定义了缓冲区和添加了一下处理步骤。
============== 1.标准IO ===========================
- 文件的打开、关闭
fopen()/fclose()
- 文件的读写
- 按字节读写:
fgetc()/getc()/getchar()
fputc()/putc()/putchar()
- 按行读写:
fgets()/gets()
fputs()/puts()
- 按格式读写:
fprintf()/printf()/snprintf()/sprintf()
fscanf()/scanf()/sscanf();
- 按数据块读写:
fread()
fwrite()
- 文件的偏移
- 文件状态判断
判断文件是否到达末尾:feof()
判断文件是否遇到错误:ferror()
demo1打开关闭文件.c
代码语言:javascript复制#include <stdio.h> // 标准IO库
int main()
{
// r:不存在则报错,存在则打开
FILE *fp = fopen("1.txt", "r");
if(fp == NULL)
{
perror("fopen failed");
return -1;
}
printf("open success!n");
// 关闭文件
fclose(fp);
return 0;
}
demo2按文件读写.c
代码语言:javascript复制#include <stdio.h> // 标准IO库
#include <unistd.h>
int main()
{
// r :读写打开。不存在则报错,存在则打开
// w : 读写打开。不存在则创建,存在则清空
// a : 读写打开。不存在则创建,存在则追加
// 1.打开文件
FILE *fp = fopen("1.txt", "r ");
if(fp == NULL)
{
perror("fopen failed");
return -1;
}
printf("open success!n");
// 2.获取文件的一个字符
int ch1;
char ch2; // 2种类型都可以。
ch1 = fgetc(fp); // 库函数
ch2 = getc(fp); // 宏函数
printf("ch1:%c-%d ch2:%c-%d n", ch1, ch1, ch2, ch2);
// 2.1 从<标准输入(键盘)缓冲区>中获取1个字符
int ch3 = getchar();
printf("2.1 ch3:%cn", ch3);
// 2.2 从<标准输入缓冲区>获取字符(效果等同于getchar())
ch3 = fgetc(stdin);
printf("2.2 ch3:%cn", ch3);
// 2.3 直接使用文件描述符获取字符
// (不同点:不带缓冲区,只能直接从键盘设备获取)
read(0, &ch3, 1);
printf("2.3 ch3:%cn", ch3);
// 3.向文件中写入一个字符
fputc('a', fp); // 库函数
putc('b', fp); // 宏函数
putchar('c'); // 直接往标准输出写入
// 3.1 使用fputc往标准输出写入
fputc('d', stdout);
// 4.关闭文件
fclose(fp);
return 0;
}
demo3按字节读写_计算.c
代码语言:javascript复制#include <stdio.h> // 标准IO库
#include <unistd.h>
int main(int argc, const char **argv)
{
// r :读写打开。不存在则报错,存在则打开
// w : 读写打开。不存在则创建,存在则清空
// a : 读写打开。不存在则创建,存在则追加
// 1.打开文件
FILE *fp = fopen(argv[1], "r");
if(fp == NULL)
{
perror("fopen failed");
return -1;
}
printf("open success!n");
// 2.循环读取文件中的每个字符
int cnt=0;
int ch;
while(1)
{
ch = fgetc(fp);
if(ch == EOF)
{
// 进一步判断到达末尾还是出错:
if(feof(fp)) // 文件到达末尾
{
printf("fgetc done!n");
break;
}
else if(ferror(fp)) // 文件出错(如文件重命名、被删除。。。)
{
perror("fgetc failed");
return -1;
}
}
cnt ;
}
printf("file size: %dn", cnt);
// 3.关闭文件
fclose(fp);
return 0;
}
demo4按行读写.c
代码语言:javascript复制#include <stdio.h> // 标准IO库
#include <unistd.h>
#include <string.h>
int main(int argc, const char **argv)
{
// r :读写打开。不存在则报错,存在则打开
// w : 读写打开。不存在则创建,存在则清空
// a : 读写打开。不存在则创建,存在则追加
// 1.打开文件
FILE *fp = fopen(argv[1], "r ");
if(fp == NULL)
{
perror("fopen failed");
return -1;
}
printf("open success!n");
// 2.按行读写
char read_buf[20];
bzero(read_buf, sizeof(read_buf));
fgets(read_buf, sizeof(read_buf), fp);
printf("read: %sn", read_buf);
// 从键盘缓冲区获取数据
bzero(read_buf, sizeof(read_buf));
printf("请输入小于20个字符的用户名: ");
// gets(read_buf);
// scanf("%s", read_buf); //效果等同于gets(),都有可能导致溢出,非法内存访问
// 替代方案:使用fgets函数,限定了获取的字符长度
fgets(read_buf, sizeof(read_buf), stdin);
strtok(read_buf, "n"); // 将字符串中的'n'替换为'