day30-标准IO(2022.3.1)

2022-12-02 14:42:11 浏览数 (1)

系统IO:由系统提供,有最基本的操作函数。(简洁、精炼)(类似于菜市场)

好处:简洁单一,稳定,不需要消耗过多系统资源。

缺点:对于功能性要求较高的程序,更加繁琐。

标准IO:由标准C库提供,拥有多样化的操作函数。(功能多样)(类似于饭馆)

好处:复杂操作更为方便,函数接口更加多样化。

缺点:消耗系统资源更多,不适用于简单功能。

——》标准IO,其本质就是调用了系统IO函数,另外定义了缓冲区和添加了一下处理步骤。

============== 1.标准IO ===========================

  1. 文件的打开、关闭

fopen()/fclose()

  1. 文件的读写
  2. 按字节读写:

fgetc()/getc()/getchar()

fputc()/putc()/putchar()

  1. 按行读写:

fgets()/gets()

fputs()/puts()

  1. 按格式读写:

fprintf()/printf()/snprintf()/sprintf()

fscanf()/scanf()/sscanf();

  1. 按数据块读写:

fread()

fwrite()

  1. 文件的偏移
  2. 文件状态判断

判断文件是否到达末尾: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'替换为''
	printf("read: %sn", read_buf);

	// 3.写入一行
	fputs("hello", fp);

	puts("nihaon");	// 不支持格式控制符,并且会在最后添加换行符'n'
	printf("nihao %dn", 123);

	// 4.关闭文件
	fclose(fp);

	return 0;
}

0 人点赞