这个问题来源于课本上的一个例子...它在整个操作过程中都是使用二进制实现的...无论是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最保险

标签: none

评论已关闭