Acaibird. 2022-07-07 09:10 采纳率: 33.3%
浏览 20

以rb打开多行字符文件,输出时,多了换行

#include <stdio.h>
#include <stdlib.h>
#define N 100
int main(){
    FILE *fp;
    char str[N+1];
    if( (fp=fopen("F:\\clion c++\\code\\cmake-build-debug-coverage\\t1.txt","rb")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }

    while(fgets(str, N, fp) != NULL){
        printf("%s", str);
    }

    fclose(fp);
    return 0;
}

//文件中字符为
feqaer
asdfasdf
adsfa
//以rb文件,读取输出
feqaer

asdfasdf

adsfa
//以r打开文件
feqaer
asdfasdf
adsfa

为什么会出现这样的结果,\n符号在二进制文件中不是不会进行隐式转化嘛,为啥会多一个换行

  • 写回答

2条回答 默认 最新

  • 泡沫o0 2023年度博客之星上海赛道TOP 1 2022-07-07 09:20
    关注

    Windows下换行符是\r\n连个字符,Linux下位\r
    fgets会在输入流末尾自动加上’\0’

    1.为什么有两个换行符?
    Windows系统下换行符是两个字符’\r’和’\n’,所以会换行两次
    2.空格哪来的??
    fgets会再读取结束后在输入流的末尾自动加上’\0’作为结束的标志,而打印’\0’字符就是一个空格。

    fgets函数原型为:char * fgets(char *restrict _Buf, int _MaxCount, FILE *restrict _File);但是fgets最多能接收的字符数量为(MaxCount - 1),这一点也要注意
    fgets会吸收缓冲区中的回车符!!!并且这个回车符也会被解析为\r\n两个字符!!,

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月7日

悬赏问题

  • ¥15 关于stm32hal库驱动ft6336触摸屏遇到的问题
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥100 关于#audobe audition#的问题,如何解决?
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22