程序示例并通过查看文件十六进制数据验证有关C语言文件打开方式wb、rb ,w、r区别与windows中C语言有关换行问题

目录

 

1.二进制打开方式wb、rb等与文本打开形式w、b区别

1.1 示例通过查看文件数据十六进制验证

 1.1.1 二进制打开方式

 1.1.2 文本或字符打开方式

 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】。

63805bf2a811433bbbfeae59e59eec72.png

 最后,可以说加不加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)

630d11cb284e4c208c1fa0722ad5b8aa.png

 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)

b36577f7cb9b433bb4d89f3fd3743607.png

 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);

 } 

d952e2fc7fd7428981d31f247385b7d2.png

 

 47165df6ce50446f9f76768188cf3663.png

         当时我奇怪的是,不是原封不动输出吗,那enter的\r\n怎么少了,后来想也许因为间接通过getchar(),类似于scanf(),\r\n被送入内存的只有\n,因此内存的原封不动的输出到文件

        相反,如果是w,则从内存的\n输出到文件会转换为\r\n

c11f7fcedae94b66a374b3952f2097c6.png 

 【1】彻底解读剪不断理还乱的\r\n和\n, 以Windows和Linux为例-CSDN博客

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值