目录
1.1.3 记事本及vscode中0x0a即\n均可实现换行
2. 通过getchar()获取窗口数据,并用wb方式将数据写入文件验证回车变成\n 即0a
1.二进制打开方式wb、rb等与文本打开形式w、b区别
首先,打开方式不等于文件内数据组织方式(数据组织方式即是一个字符占一个字节的文本文件,如123为‘1’‘ 2’ ‘3’ 三个字节,或按二进制直接存储的二进制文件如123就是类似于int型占4字节0x7b)。
其次,还要了解,windows按下enter是键入\r\n 即0x0d 0x0a,而c语言对于'\n'即识别为换行且将光标移到最前端【引自1】。
最后,可以说加不加b的区别就是:
当加b,表示二进制读取,会将内存中字节原封不动输出到文件;也会将文件字节原封不动读入内存。
当不加b,表示字符或文本读取,内存输出到文件时(均讨论windows环境下)将'\n'转换成'\r\n';当输入内存会将 \n 转换成'\r\n'。
1.1 示例通过查看文件数据十六进制验证
1.1.1 二进制打开方式
char cs[50] = "a\na"; //不经窗口键盘,通过二进制只写wb直接按字节传送字节 if((fp = fopen(fname,"wb")) == NULL) { printf("Error to open file\n"); exit(0); } for(char *cp = cs;*cp !='\0';fputc(*cp,fp),cp++); fclose(fp);
查看文件数据16进制:
将a'\n'a 原封不动写入 (\n ASCII码为10,十六进制为0a)
1.1.2 文本或字符打开方式
char cs[50] = "a\na";//不经窗口键盘,通过文本只写w直接按字节传送字节 if((fp = fopen(fname,"w")) == NULL) { printf("Error to open file\n"); exit(0); } for(char *cp = cs;*cp !='\0';fputc(*cp,fp),cp++); fclose(fp);
查看文件数据16进制:
将a'\n'a转换为a'\n''\r'a (\r ASCII码为13,十六进制为0d)
1.1.3 记事本及vscode中0x0a即\n均可实现换行
首先要明确,如果你在记事本中enter,则记事本会多出来两个字节即 \r\n ,这一方面说明了windows中处理我们理解的换行(新启一行,光标来到行首)还是上文中\r\n。
但是上面1.1.1中,仅\n即0x0a就可以被编辑器识别为换行,就我理解,虽然windows系统层面将\r\n理解为换行,但就编辑器软件层面或许做了优化,即\n 或 \r\n均可显示换行。当然只是我的能解释的通的猜测,还没找到相关明确文章。
2. 通过getchar()获取窗口数据,并用wb方式将数据写入文件验证回车变成\n 即0a
#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { FILE *fp; char c; char fname[20]; printf("please enter a name of file:\n"); scanf("%s",fname); getchar();//吃掉一个回车 if((fp = fopen(fname,"wb")) == NULL) //打开文件 { printf("Error to open file\n"); exit(0); } printf("enter some character and end by '#':\n"); while((c = getchar() )&& c!='#') { fputc(c,fp); } fclose(fp); }
当时我奇怪的是,不是原封不动输出吗,那enter的\r\n怎么少了,后来想也许因为间接通过getchar(),类似于scanf(),\r\n被送入内存的只有\n,因此内存的原封不动的输出到文件。
相反,如果是w,则从内存的\n输出到文件会转换为\r\n
【1】彻底解读剪不断理还乱的\r\n和\n, 以Windows和Linux为例-CSDN博客