参考材料:
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什么时候会出错