fopen中r与rb的区别?
这个问题来源于课本上的一个例子...它在整个操作过程中都是使用二进制实现的...无论是wb还是rb...
2023年01月07日更新...计网缓存实验中,我说怎么每写一个0x0A,前面自动给我加上一个0x0D,变成0x0A、0x0D了呢?再次说明了要用wb
的重要性...
以下是我复刻后的:
//Target Create a txt and write sth on it.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
FILE *fp;
int main(void){
fp = fopen("demo.txt", "wb");
//if open successfully
if(fp == NULL){
printf("Ooooooops, there is an error!");
exit(0);
}
//Okay, Now next...
//Task 1:Write the 1~127's ASCII into the file
int i;
for(i=1; i<=127; i++){
fputc(i,fp);
}
fclose(fp);
//Task 1:Successfully!
//Task 2:Read the file and print the !control char, if not, print the ascii.
char ch;
fp = fopen("demo.txt", "rb");
while(!feof(fp)){
ch = fgetc(fp);
if(!iscntrl(ch)){
printf("%c\t", ch);
}else{
printf("%d\t", ch);
}
}
fclose(fp);
//Task 2:Successfully!
return 0;
}
注意到在执行Task2的时候,它使用了rb方式去读取文件。
那么如果我们把它改成r的话,会发现它只能输出1~25的数字?
找了找网上的一些说法,大概有如下声音:
说法1:r方式读取会自动略过控制字符?
我不认同,因为我改成r之后并没有输出所有的非控制字符。说法2:如果是纯粹的文本文档(纯粹的,意味着即便它是一个文本文档,里头也没有操作符),那么可以用r。其他情况为了避免错误,统统使用rb方式读取文件。
这个我感觉有点道理!
除此之外还找到了这么一件事:
使用r方式的时候,它会把换行符从2个字符变成1个字符,但rb不会。
目前还没遇到这件事...遇到后再说吧。
反正暂时记住一点:
非纯文本一律rb,即便是纯文本也可以使用rb,rb最保险!
评论已关闭