前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day30-标准IO(2022.3.1)

day30-标准IO(2022.3.1)

作者头像
天天Lotay
发布2022-12-02 14:42:11
4200
发布2022-12-02 14:42:11
举报
文章被收录于专栏:嵌入式音视频嵌入式音视频

系统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:%c\n", ch3);

		// 2.2 从<标准输入缓冲区>获取字符(效果等同于getchar())
	ch3 = fgetc(stdin);
	printf("2.2 ch3:%c\n", ch3);

		// 2.3 直接使用文件描述符获取字符
	// (不同点:不带缓冲区,只能直接从键盘设备获取)
	read(0, &ch3, 1);
	printf("2.3 ch3:%c\n", 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: %d\n", 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: %s\n", 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'替换为'\0'
	printf("read: %s\n", read_buf);

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

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

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

	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档