C语言文本方式和二进制方式读写操作的区别
2个回答
展开全部
首先要明白一点:任何数据在内存中或者硬盘上的存储都是1、0组成的序列,从硬盘、内存这个角度看根本不存在什么二进制和文本模式之分
区别
稍对C语言操作文件有了解都知道2点:1、首先应该fopen打开文件2、有两类文件操作函数,对应着二进制模式和文本模式。
两个模式的区别在两个地方,这两个地方的区别正好体现在刚才说的2点上。
1、
打开文件时选择模式
使用fopen函数时,要给予第二个参数一个值,告诉fopen使用什么模式打开文件。这里的参数决定的就是第一个区别:对于字符串中的\n如何处理?
教材中说,文本模式中,在存储\n时要转化为\r\n,读取文件时进行逆转换。二进制模式时,则不进行转换。这是在操作系统是Windows的条件下。
首先我们要知道回车和换行是不相同的,Windows中文字另起一行内存表示为<回车><换行>对应\r\n,而Linux、Unix中则是单单一个<换行>对应\n。Mac中则是一个<回车>对应\r
C语言起源于Unix的产生,对于文件中的另起一行,Unix采用单个\n表示。所以我们通常在输出一个短话想换行时加一个\n就可以了,Windows也是如此。到了数据从内存到硬盘上进行存储时,对于unix来说,\n照样是\n。而Windows为了防止读取时混乱必须转换为\r\n。Mac呢,就是\r。
这就是第一区别,这个区别是体现在fopen第二个参数,跟你使用文本模式的函数还是二进制模式的函数根本不相关!你可以做一个实验,使用二进制模式的函对于同样的字符串:”Hello\n”,当fopen使用w参数写入文件,无论是fwrite还是fprintf都会对\n会进行转换,而使用wb参数则都不进行转换。
2、
两种不同模式的函数
打开文件后,要进行数据写入。
教材中说,使用文本模式打开文件,就要用fprintf写入数据,使用二进制模式打开文件,就要用fwrite写入数据。
其实你用文本模式打开文件,一个字符串,fprintf、fwrite都能写入文件,写入还都是一样的数据。使用两类函数的区别其实在于数字的处理上。
对于一个数字5,你用fprintf写入,将把数字5转换为字符5,将其对应的ASCII编码存入存储器,占用1个字节。但实际上数字5就是数字5,对应2进制101,整形占用4个字节。fwrite则将这个数字在内存中占用的4个字节全部原样写入到硬盘中,占4个字节。
而同样对于一段字符串”Hello”,使用ASCII编码对于fprintf和fwrite都能原样写到硬盘中。
同样对于这个区别,你仍然能做个实验,对于一个int型数字5,你如何用fprintf和fwrite写入到硬盘中,他们对应的十六进制码是多少?对于一段字符串你再用两个函数分别写到硬盘中,你看看对应的十六进制码是什么。这个实验跟你用fopen如何指定第二个参数无关。
区别
稍对C语言操作文件有了解都知道2点:1、首先应该fopen打开文件2、有两类文件操作函数,对应着二进制模式和文本模式。
两个模式的区别在两个地方,这两个地方的区别正好体现在刚才说的2点上。
1、
打开文件时选择模式
使用fopen函数时,要给予第二个参数一个值,告诉fopen使用什么模式打开文件。这里的参数决定的就是第一个区别:对于字符串中的\n如何处理?
教材中说,文本模式中,在存储\n时要转化为\r\n,读取文件时进行逆转换。二进制模式时,则不进行转换。这是在操作系统是Windows的条件下。
首先我们要知道回车和换行是不相同的,Windows中文字另起一行内存表示为<回车><换行>对应\r\n,而Linux、Unix中则是单单一个<换行>对应\n。Mac中则是一个<回车>对应\r
C语言起源于Unix的产生,对于文件中的另起一行,Unix采用单个\n表示。所以我们通常在输出一个短话想换行时加一个\n就可以了,Windows也是如此。到了数据从内存到硬盘上进行存储时,对于unix来说,\n照样是\n。而Windows为了防止读取时混乱必须转换为\r\n。Mac呢,就是\r。
这就是第一区别,这个区别是体现在fopen第二个参数,跟你使用文本模式的函数还是二进制模式的函数根本不相关!你可以做一个实验,使用二进制模式的函对于同样的字符串:”Hello\n”,当fopen使用w参数写入文件,无论是fwrite还是fprintf都会对\n会进行转换,而使用wb参数则都不进行转换。
2、
两种不同模式的函数
打开文件后,要进行数据写入。
教材中说,使用文本模式打开文件,就要用fprintf写入数据,使用二进制模式打开文件,就要用fwrite写入数据。
其实你用文本模式打开文件,一个字符串,fprintf、fwrite都能写入文件,写入还都是一样的数据。使用两类函数的区别其实在于数字的处理上。
对于一个数字5,你用fprintf写入,将把数字5转换为字符5,将其对应的ASCII编码存入存储器,占用1个字节。但实际上数字5就是数字5,对应2进制101,整形占用4个字节。fwrite则将这个数字在内存中占用的4个字节全部原样写入到硬盘中,占4个字节。
而同样对于一段字符串”Hello”,使用ASCII编码对于fprintf和fwrite都能原样写到硬盘中。
同样对于这个区别,你仍然能做个实验,对于一个int型数字5,你如何用fprintf和fwrite写入到硬盘中,他们对应的十六进制码是多少?对于一段字符串你再用两个函数分别写到硬盘中,你看看对应的十六进制码是什么。这个实验跟你用fopen如何指定第二个参数无关。
展开全部
这个是为了打印,增加的判断,为保证程序健壮性很需要如此累赘
打印\r将会影响文件倒序打印的效果,putchar打印eof(一般是-1),我也没试过,但肯定是非正常输出。
所以增加这两个判断,是为了避免异常及保证打印效果
虽然-1把eof除外,谁也不知道是否输入的文件就是一个正常文件
int
fseek(
file
*stream,
long
offset,
int
origin
);
第一个参数stream为文件指针
第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:
seek_set:
文件开头
seek_cur:
当前位置
seek_end:
文件结尾
在c语言中,用函数getc(fgetc)从文件读取字符。getc、fgetc用法相同。
getc的调用形式:ch=getc(fp);此处的fp是文件指针;函数功能是从文件指针指向的文件读入一个字符,并把它作为函数值返回给字符型变量ch。
打印\r将会影响文件倒序打印的效果,putchar打印eof(一般是-1),我也没试过,但肯定是非正常输出。
所以增加这两个判断,是为了避免异常及保证打印效果
虽然-1把eof除外,谁也不知道是否输入的文件就是一个正常文件
int
fseek(
file
*stream,
long
offset,
int
origin
);
第一个参数stream为文件指针
第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:
seek_set:
文件开头
seek_cur:
当前位置
seek_end:
文件结尾
在c语言中,用函数getc(fgetc)从文件读取字符。getc、fgetc用法相同。
getc的调用形式:ch=getc(fp);此处的fp是文件指针;函数功能是从文件指针指向的文件读入一个字符,并把它作为函数值返回给字符型变量ch。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询