【C语言】I/O函数

1.错误报告函数

1)strerror

通过标准错误的标号,获得错误的描述字符串 ,将单纯的错误标号转为字符串描述,方便用户查找错误,但是使用不够方便。

2)perror

函数原型:void perror(const char *s);
perror( ) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。
在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。
eg:

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<limits.h>
int  main()
{
	int *p = malloc(INT_MAX);
	if (p == NULL)
	{
		perror("use malloc");
		//exit(EXIT_FAILURE);//结束程序
		//atexit
	}
	//访问


	free(p);
	p = NULL;
	system("pause");
	return 0;
}

运行结果为:
这里写图片描述

3)exit

在上面代码中,如果内存分配出错,应该退出函数,这就用到了exit函数,它用于终止一个程序的执行,这个函数定义在stdlib.h中,原型如下:
void exit(int status);
参数status返回给操作系统,用于提示程序是否正常完成。
C语言定义了预定义符号:
EXIT_SUCCESS表示成功返回
EXIT_FAILURE表示失败返回

2.I/O函数概念

1)I(input)/O(output)

ANSI C规定就C程序而言,所有的I/O操作就是简单的从程序移进移出字节的事情,因此这种字节流被称为。这样程序员就只要关注创建正确的输出字节数据,已经正确的解释从输入读取的字节。
绝大 多数的流都是完全缓冲,这就意味着“读取”和“写入”都是在一块被称为:缓冲区的内存区来回复制数据,从内存中来回复数据是特别快的。用于输出流的缓冲区只有被写满的时候才会被刷新(ffush,物理写入)到设备或者文件。一次性把放满的缓冲区数据写入和遂片把程序产生的数据写入相比效率更高。

2)流

分为两种文本流二进制流

  • 文本流在不同的系统中实现不太相同
  • 二进制流中的字节完全是安装程序编写他们形式写入到文件和设备中。而且完全根据他们从文件或设备读取的形式读入到程序。

3.文件

在stdio.h定义一个FILE结构
它和磁盘上的文件不一样。FILE
是一个数据结构,用于访问一个流。如果你激活几个流,每个流都会对应一个FILE结构。
为了操作流程,你调用一些合适的函数,并向函数传递一个与这个流相关的FILE参数。
对于每一个ANSI C程序而言,至少打开三个流:标准输入(stdin),标准输出(stout),标准错误(stderr)他们都是一个指向FILE结构的指针。
通常:

  • 标准输入为:键盘设备
  • 标准输出为:终端或者屏幕

4.I/O常量

EOF-文件结束标志,表示文件到了结尾
FOPE_MAX-一个程序最多打开文件数(20)
FILENME _MAX-文件名的最大长度(260)

5.I/O函数总览

1)基本概念

在这里插入图片描述
这里写图片描述

2)函数使用

a)在文件test,txt生成b字符。
int  main()
{	
    FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("open file for write");
		exit(EXIT_FAILURE);
	}
	//写操作
	fputc('b', pf);
	fclose(pf);
	pf = NULL;
}

b)从文件test.txt读出b字符。
int  main()
{	
	//读操作
	int ch = 0;
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("open file for write");
		exit(EXIT_FAILURE);
	}
	ch=fgetc(pf);
	fputc(ch, stdout);
	pf = NULL;
	system("pause");
	return 0;
}

c)在文件test.txt生成文本行

eg:

int main()
{
	int ch = 0;
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("open file for read");
		exit(EXIT_FAILURE);
	}
	fputs("bit\n", pf);
	fputs("hehe\n", pf);

	fclose(pf);
	pf = NULL;
	system("pause");
	return 0;
}
d)从文件test.txt读出文本行

eg:

int main()
{
	int ch = 0;
	char  arr[10];
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("open file for read");
		exit(EXIT_FAILURE);
	}
	fgets(arr,10,pf);
	printf("%s", arr);
	fgets(arr, 10, pf);
	printf("%s", arr);

	fclose(pf);
	pf = NULL;
	system("pause");
	return 0;

}
e) fscanf与fprintf的使用

eg:

文件中写入


int main()
{
	char arr[10] = { 0 };
	int age = 0;
	char ch = 0;
	FILE* pf = fopen("text.txt", "w");

	fscanf(stdin, "%s %d %c", arr, &age, &ch);
	fprintf(pf, "%s %d %c", arr, age, ch);

	fclose(pf);
	pf = NULL;
	system("pause");
	return 0;
}

文件中读取

int main()
{
	char arr[10] = { 0 };
	int age = 0;
	char ch = 0;
	FILE* pf = fopen("text.txt", "r");
	fscanf(pf,"%s %d %c", arr, &age, &ch);
	fprintf(stdout, "%s %d %c", arr, age, ch);

	

	fclose(pf);
	pf = NULL;
	system("pause");
	return 0;
}

f) sscanf sprintf以格式化的形式从字符串里读出结构化的数据
struct S
{
	char name[20];
	int age;
	float  score;
};
int  main()
{
	struct S stu = { "zhangsan", 20, 120.0f };

	char buf[100];
	sprintf(buf, "%s %d %f", stu.name, stu.age, stu.score);
	
	printf("%s", buf);

	system("pause");
	return 0;

}

int  main()
{
	struct S stu = { "zhangsan", 20, 120.0f };
	struct S tmp = { 0 };
	char buf[100];
	sprintf(buf, "%s %d %f", stu.name, stu.age, stu.score);
	sscanf(buf,"%s %d %f",tmp.name,&(tmp.age),&(tmp.score));
	printf("%s %d %f", tmp.name, tmp.age, tmp.score);
	system("pause");
	return 0;

}
int main(int  argc,char*argv[],char*envp)
{
	FILE* pfRead = NULL;
	FILE* pfWrite = NULL;
	int ch = 0;
	if (argc != 3)
	{
		printf("参数个数有误,必须是三个参数(例如test.exe test,txt test.txt.bak)");
		exit(EXIT_FAILURE);
     }
	pfRead = fopen(argv[1], "r");
	if (pfRead == NULL)
	{
		perror("open file for read");
		exit(EXIT_FAILURE);
	}
	pfWrite = fopen(argv[2], "w");
	if (pfWrite == NULL)
	{
		perror("open file for write");
		fclose(pfRead);
		exit(EXIT_FAILURE);
	}


	while (EOF != (ch=fgetc(pfRead)))
	{
		fputc(ch, pfWrite);
	}
	fclose(pfRead);
	pfRead = NULL;
	fclose(pfWrite);
	pfWrite = NULL;


	system("pause");
	return 0;
}

g)fread与fwrite

写进文件


struct S
{
	char name[20];
	int age;
	float  score;
};
int  main()
{
	struct S stu = { "zangsan", 20, 120.0f };
	FILE* pf = fopen("test.txt", "w");
	fwrite(&stu,sizeof(struct S),1,pf );



	fclose(pf);
	pf = NULL;
	system("pause");
	return 0;
}

从文件读出

int  main()
{
	struct S stu = { 0 };
	FILE* pf = fopen("test.txt", "r");
	fread(&stu, sizeof(struct S), 1, pf);
	printf("%s %d %f\n", stu.name, stu.age, stu.score);


	fclose(pf);
	pf = NULL;
	system("pause");
	return 0;
}
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值