关于标准I/O的实验

参考材料:

http://blog.csdn.net/liulina603/article/details/12080061   点击打开链接


首先贴出实验程序如下:

void main()
{
	FILE* fpwrite = fopen("hello.txt", "wb");
	FILE* fpread=  fopen("test.txt", "rb");
	/*注意:上面2行和下面2行的运行结果完全不同!!!思考
	下面2行会读出很多0
	FILE* fpwrite = fopen("hello.txt", "w");
	FILE* fpread=  fopen("CET-4.jpg", "r");
	*/


	int count = 0;
	
	unsigned char temp;
	while(count < 1200000)
	{
		fread(&temp, sizeof(unsigned char), 1, fpread);
		fprintf(fpwrite, "%0X ", temp);
		fflush(fpwrite);
		++count;
	}

	printf("total write: %d", count);
	fclose(fpread);
	fclose(fpwrite);
	
	system("pause");
}

我们的第一个实验是改变fopen的方式:b和不加b.

实验材料:test.txt内容  FF(+回车)

以下列出实验结果

**************************************************************

结果1:FILE* fpwrite = fopen("hello.txt", "wb");
       FILE* fpread=  fopen("CET-4.jpg", "rb")

输出:46 46 D A A A A A A  ........         (思考方向,txt中每个输出如46是一个16进制表示。结合ASCII码表解释)

(解释,为什么会写出那么多最后一个十六进制‘A’,思考方向:fread的行为)


**************************************************************

结果2:FILE* fpwrite = fopen("hello.txt", "wb");
       FILE* fpread=  fopen("CET-4.jpg", "r")

输出:46 46 A A A A ........          (发现少了一个D)


**************************************************************

结果3:FILE* fpwrite = fopen("hello.txt", "w");
       FILE* fpread=  fopen("CET-4.jpg", "rb")

输出:46 46 D A A A A  ........         


**************************************************************

结果4:FILE* fpwrite = fopen("hello.txt", "w");
       FILE* fpread=  fopen("CET-4.jpg", "r")

输出:46 46 A A A A A   ........        


**************************************************************

小结实验1的结果1~4.

1:对于要fread的文件打开方式很重要,打开方式由fopen决定:用r方式打开,则“回车”只会当作ASCII码中的‘0XA’;而用rb方式打开,则“回车”则会当作‘0XD’与‘0XA’;

2:用fread读一个文件是读取这个文件中实际储存的值,如FF会读成0X46,0X46;

3:如果fread读取失败,则也不会自己主动停止,而是会不断读入最后一个字符(只发现了这个现象,原因还要看书)


********************************************************************************************************

——》第二个实验:把fread换乘fscanf。

void main()
{
	FILE* fpwrite = fopen("hello.txt", "w");
	FILE* fpread=  fopen("test.txt", "r");
	/*注意:上面2行和下面2行的运行结果完全不同!!!思考
	下面2行会读出很多0
	FILE* fpwrite = fopen("hello.txt", "w");
	FILE* fpread=  fopen("CET-4.jpg", "r");
	*/


	int count = 0;
	
	unsigned char temp;
	while(count < 100)
	{
		fscanf(fpread, "%c", &temp);
		fprintf(fpwrite, "%0X ", temp);
		fflush(fpwrite);
		++count;
	}

	printf("total write: %d", count);
	fclose(fpread);
	fclose(fpwrite);
	
	system("pause");
}

实验材料:text.txt内容:FF(回车)

结果1:  fscanf(fpread, "%c", &temp);
fprintf(fpwrite, "%0X ", temp);

输出:46 46 A A A A A 


***************************************************************

结果2:fscanf(fpread, "%X", &temp);
      fprintf(fpwrite, "%0X ", temp);

输出:FF FF FF FF FF (每执行一次循环,会输出FF,而不是F)


***************************************************************

结果3(与结果1对比):把FILE* fpread=  fopen("test.txt", "r");

      改成FILE* fpread=  fopen("test.txt", "rb");

fscanf(fpread, "%c", &temp);
fprintf(fpwrite, "%0X ", temp);

输出:46 46 D A A A A 


***************************************************************

结果4:fscanf(fpread, "%d", &temp);
      fprintf(fpwrite, "%0X ", temp);

输出:CC CC ....

说明:如果fscanf不能按照指定格式读入数据,fscanf也不会自动停止,但是也不会向temp中读入任何数据

***************************************************************************************************

实验2小结:

——》fread是按照数据真实储存值读入的;

而fscanf则会按照指定格式对输入数据进行对应的解读。如果不能按照指定格式解读,就会出错,但是不会自动停止,也不会向存储空间中存入错误的数据

——》用ftell对判断fread和fscanf进行到哪个地方非常有帮助。

fscanf(fpread, "%d", &temp);
printf("%ld ",ftell(fpread));
fprintf(fpwrite, "%0X ", temp);

可以看出,因为无法按照%d的格式读入数据,所以ftell一直都返回0;而如果将第一行的%d换成%c,则会返回1,2,.....


所以,对于实验1和实验2重要的问题在于:

——》fread,fscanf(scanf,getchar等等输入函数)在什么时候会出错?如何处理这些出错情况?

——》其他标准I/O什么时候会出错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值