C++中关于text file和binary file

本文详细解析了ASCII文件与二进制文件的区别及联系,包括文件格式、编码方式、处理方法及其在不同操作系统中的表现。同时探讨了C语言标准库如何处理这两种文件类型,以确保跨平台的兼容性和可移植性。

  ASCII文件也称为text文件,每一个字节存放一个ascii代码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘文件存放。如一个整数10000  ,在内存中占2个字节,如果按ascii形式输出,则占5个字节分别存放字符1,0,0,0,0,而按二进制形式输出则占2个字节,用ascii形式与字符一一对应,便于对字符处理,输出字符,但占存储空间较大,而且要花费转换时间(二进制形式与ascii码形式之间的转换)

   文件结束标志符:EOF(-1),对于文本文件,当读入的字符为EOF时,就表明读入的不是正常的字符而是文件结束符。由于ANSI C允许用缓冲文件系统处理二进制文件,对于二进制文件,读入的字符有可能是-1,而这又是EOF的值,这就出现了读入有用字符而被处理为文件结束的情况。为了解决这个情况,ANSI C提供了一个feof(fp)来判断文件是否真的结束,用feof(fp)来测试fp所指向的文件当前状态是否“文件结束”,是,函数feof(fp)返回1(真),否,返回0(假)

 

 

 

 

ASCII文件包含text文件和binary文件,只要这些文件的编码是ASCII字符集的。与binary文件相对的概念叫做“text文件”!

 

关于下面这个问题:

   在unix,linux等类unix下无TEXT BINARY之分。
因为含义可见文件的行结束是一个0x0a.
其他系统下必须区分。fopen时要指定是ascii或binary.以便文件读入,输出是进行必要的格式转换
fopen的时候不指定ascii,Windows下的"rb","rt"恰恰对应的是birany和text。
如果你说不知道什么是"rt"?rt=r,查一下MSC/TC的文档。VC的我没查过,不知道还有没有"rt"之说。

网友的回答:

(1)

   以下的"文本文件"==text file   "二进制文件"==binary file
第一,ascii文件!=文本文件.文本文件是可打印的字符加上控制字符.
第二,不同的平台使用的打印字符集可能不同,控制字符也可能不同
第三,ascii标准并不能约束文本文件.
第三,不同平台上的文本文件的不同在于控制字符的不同
第四,对同于一个平台在系统级别或者说系统调用级别上来说没有文本文件和二进制文件的区别.
第五,文本文件是C语言标准库为统一各个平台上控制字符和应付以后的发展提出的概念.

所以flw所谓的相同,在C语言标准I/O库层次上看是对的,站在系统调用的角度看,就是错的.所以总起来说是错的

系统向打印机,终端,控制台等写文本时候,驱动程序依据控制字符来驱动设备.你的文本文件要输出一定的格式你就必需向文件中写入控制字符.由于在不同的平台上控制字符不同的可能性和事实上的存在,C语言标准IO库才会弄出个text file来,这样只用一套控制字符就可以了.这样做的目的是IO库屏蔽掉平台之间的差异,C程序具有可移植性.
但C语言IO库这套控制字符从哪里来呢?他的控制字符是ascii标准吗?不是.拿'/n'来说,它在ascii标准中只是起换行作用的.但IO库把它作为/r/n.这足以说明这个控制字符不是ascii标准的.

(2)

我引用一个文件的定义:
[quote]
A file stored in binary format. A binary file is computer -readable but not human-readable. All executable programs are stored in binary files, as are most numeric data files. In contrast, text files are stored in a form (usually ASCII) that is human-readable.

 

我再引用一个
Binary File
A binary file, unlike an ASCII file, contains more than plain text(纯文本文件). It may contain additional code information for photos, sounds, a spreadsheet, or formatted word-processing text. Like an ASCII file, a binary file is made up of machine-readable symbols that represent 1s and 0s. Binary files include sound files, graphics files, and software, and are frequently called binaries.

 

(3)

你能认识到所有的数据,只不过是“二进制流”,这很好,说明你已经能够“透过现象看本质”了,可是,看明白“本质”以后,难道就不管“现象”了?

(4)

所有的文件都是二进制文件,
文本文件只不过是二进制文件一个子集而已

 

简单的说,明白的人,啥时候都不会在这个文件操作上翻跟头。
其实就是,一个二进制流。你愿意原封不动的看,那就是二进制文件。你愿意去在意特定的“行”的概念,以及行和行之间的标志(各个系统之间不同),那就是文本文件

(5)

无论任何文件,都是由一个个字节组成的,不管是在存储介质上存储,还是在网络中传输。我们通常意义上的文本文件,实际上是只包含可见字符(和回车换行等控制字符)的文件。而ascii的严格定义是:
ASCII is the American Standard Code for Information Inter-
       change.  It is a 7-bit code. Many 8-bit codes (such as ISO
       8859-1, the Linux default character set) contain ASCII  as
       their  lower half.
0x00也是ASCII码之一;但包含0x00的文件我们绝对不能称之为文本文件。在ftp中的asii方式与binary  实际上只是借用了一下定义而已,ascii方式在不同字符集间有转换,如EBCDIC->;ascii,unix like text ->;win like text,而binary方式不作任何转换。

 

 (6)

二进制与文本方式的区别不是这样看的,两者的主要区别,是文本方式允许在输入或输出时,对某些字符进行替换、增加或删除等操作。在windows下,主要的区别就是写入时/n会被替换为/r/n,输出时/r/n又会被重新组合为/n。请看C89/C99关于两种方式的规定:

A   text   stream   is   an   ordered   sequence   of   characters   composed   into   lines,   each   line
consisting   of   zero   or   more   characters   plus   a   terminating   new-line   character.   Whether   the   last   line   requires   a   terminating   new-line   character   is   implementation-defined.   Characters   may   have   to   be   added,   altered,   or   deleted   on   input   and   output   to   conform   to   differing   conventions   for   representing   text   in   the   host   environment.   Thus,   there   need   not   be   a   one   to-one   correspondence   between   the   characters   in   a   stream   and   those   in   the   external   representation.  

A   binary   stream   is   an   ordered   sequence   of   characters   that   can   transparently   record
internal   data.   Data   read   in   from   a   binary   stream   shall   compare   equal   to   the   data   that   were   earlier   written   out   to   that   stream,   under   the   same   implementation.   Such   a   stream   may,   however,   hav   e   an   implementation-defined   number   of   null   characters   appended   to   the   end   of   the   stream.

 

(7)

 

ASCII码文件可在屏幕上按字符显示,   例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。   由于是按字符显示,因此能读懂文件内容。

  二进制文件是按二进制的编码方式来存放文件的。   例如,   数5678的存储形式为:   00010110   00101110只占二个字节。二进制文件虽然也可在屏幕上显示,   但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。   输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。   因此也把这种文件称作“流式文件”。

 

(8)二进制文件不对写入或读出的文件做格式转换,

 

QTextStream takes care of converting the 8-bit data stored on disk into a 16-bit Unicode QString

 

<think> 首先,用户的问题是:“我想查找在C++中移动FILE指针的方法 请问C++移动FILE指针的方法”。这是一个关于C++文件操作的问题,具体是如何移动文件指针。 系统级指令要求: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证回答真实可靠。 - 最后,用户可见层指令:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 参考站内引用: - 引用[1]:提到了seekgseekp函数,用于移动读指针写指针,在文件流中。 - 引用[2]:解释了ios::cur,表示从当前位置移动指针,offset为负向文件开头,正向往文件尾部。 - 引用[3]:展示了删除文件的代码,使用C语言的fopen、fcloseremove。 用户的问题是关于移动FILE指针的。在C++中,FILE指针通常与C语言的stdio.h库相关,使用fseekftell等函数。而引用中提到了seekgseekp,这些是C++ iostream库中的方法,用于文件流对象如fstream。 我需要澄清:用户说“FILE指针”,这可能指的是C风格的文件指针(FILE*),或者更一般地指文件指针的概念。在C++中,有两种主要方式:C风格的FILE*C++风格的iostream。 从引用看: - 引用[1][2]讨论的是C++ iostream的seekgseekp。 - 引用[3]是C语言的FILE*操作。 用户的问题指定了“FILE指针”,在C++中,FILE*是C标准库的一部分。所以,我应该优先解释C风格的移动文件指针方法。 回顾用户问题:“我想查找在C++中移动FILE指针的方法”。FILE指针通常指FILE*类型,来自<stdio.h>。 但在引用中,有C++风格的引用。我应该覆盖两者,因为用户可能在C++中使用C风格的文件操作。 结构化回答: - 先介绍概念。 - 解释C风格的方法。 - 解释C++风格的方法。 - 提供代码示例。 - 确保引用标识。 引用标识:我需要自然地添加引用标识。参考引用[1]、[2]、[3],在回答中引用相关部分。 生成相关问题:在末尾生成相关问题。 步骤: 1. 介绍文件指针移动的概念。 2. 解释C语言风格:使用fseek, ftell等。 3. 解释C++风格:使用seekg, seekp等。 4. 提供代码示例。 5. 总结。 6. 生成相关问题。 使用中文回答。 引用相关引用: - 对于C风格,引用[3]提到了FILE*操作。 - 对于C++风格,引用[1][2]详细解释了seekgseekp。 在回答中,当提到相关点时,添加引用标识。 例如: - 当讨论fseek时,可以引用[3]。 - 当讨论seekg时,引用[1][2]。 系统指令要求:“回答中引用的段落末尾自然地添加引用标识”。所以,在句子末尾添加[^数字]。 现在,构建回答。 大纲: - 开头:解释文件指针移动的目的。 - C风格方法: - 使用fseek函数移动指针。 - 参数:FILE*指针、偏移量、起始位置(SEEK_SET, SEEK_CUR, SEEK_END)。 - 示例代码。 - 引用[3]。 - C++风格方法: - 使用seekgseekp。 - 参数:偏移量、方向(ios::beg, ios::cur, ios::end)。 - 示例代码。 - 引用[1][2]。 - 总结。 - 相关问题。 代码示例:使用代码块,像示例中那样。 在回答中,确保没有数学表达式需要处理,除非有,但用户问题是关于文件指针的,可能没有数学内容。但系统指令要求数学表达式用$...$,如果有的话。 最终,生成相关问题。 </think>### C++中移动文件指针的方法 在C++中,移动文件指针是实现文件随机访问的关键操作。文件指针指示了读写操作的当前位置,移动指针可以高效地定位到文件的特定部分。根据您的需求,我将分步解释两种主要方法:C风格(使用`FILE*`指针)C++风格(使用iostream库)。回答基于可靠的编程实践参考引用[^1][^2][^3]。 #### 1. **C风格方法:使用`FILE*``fseek`函数** C风格文件操作基于`<stdio.h>`库,核心函数是`fseek`,用于移动文件指针。其原型为: ```cpp int fseek(FILE *stream, long offset, int origin); ``` - **参数说明**: - `stream`:文件指针(`FILE*`类型)。 - `offset`:偏移量(字节数),可为正(向文件尾部移动)或负(向文件开头移动)。 - `origin`:起始位置,常用宏: - `SEEK_SET`:文件开头(类似`ios::beg`)。 - `SEEK_CUR`:当前位置(类似`ios::cur`)。 - `SEEK_END`:文件末尾(类似`ios::end`)。 - **返回值**:成功返回0,失败返回非0值。 - **示例代码**: ```cpp #include <stdio.h> int main() { FILE *file = fopen("example.txt", "r+"); // 打开文件读写模式 if (file == NULL) { perror("文件打开失败"); return 1; } // 移动指针到文件开头后第10字节 fseek(file, 10, SEEK_SET); // 读取或写入操作... fclose(file); return 0; } ``` 此方法兼容CC++,但需手动管理资源。参考引用[^3]展示了类似文件操作。 #### 2. **C++风格方法:使用iostream的`seekg``seekp`** C++ iostream库(`<fstream>`)提供更安全的面向对象方式。使用`seekg`移动读指针,`seekp`移动写指针: - **函数原型**: ```cpp istream& seekg(streampos pos); // 绝对位置 istream& seekg(streamoff offset, ios_base::seekdir dir); // 相对位置 ostream& seekp(streampos pos); ostream& seekp(streamoff offset, ios_base::seekdir dir); ``` - **参数说明**: - `pos`:文件中的绝对位置(字节索引)。 - `offset`:相对偏移量(可为正或负)。 - `dir`:方向枚举: - `ios::beg`:文件开头(类似`SEEK_SET`)。 - `ios::cur`:当前位置(类似`SEEK_CUR`),offset为负向文件开头移动,为正向尾部移动[^2]。 - `ios::end`:文件末尾(类似`SEEK_END`)。 - **示例代码**: ```cpp #include <fstream> #include <iostream> using namespace std; int main() { fstream file("example.txt", ios::in | ios::out); // 读写模式 if (!file) { cerr << "文件打开失败" << endl; return 1; } // 移动读指针:从文件开头后移20字节 file.seekg(20, ios::beg); char buffer[100]; file.read(buffer, sizeof(buffer)); // 读取数据 // 移动写指针:从当前位置前移5字节 file.seekp(-5, ios::cur); file.write("test", 4); // 写入数据 file.close(); return 0; } ``` 此方法更安全,支持异常处理。参考引用[^1][^2]详细解释了偏移逻辑。 #### 3. **关键区别与最佳实践** - **C风格 vs C++风格**: - C风格(`fseek`)兼容性好,但易出错(需手动关闭文件)。 - C++风格(`seekg/seekp`)面向对象,集成错误检查(如`fail()`方法)。 - **常见问题**: - 偏移量超出文件范围会导致未定义行为,建议先检查文件大小(用`ftell`或`tellg`)。 - 二进制文件需指定`ios::binary`模式,避免文本模式下的字符转换。 - **性能建议**:随机访问小文件时指针移动高效;大文件时,顺序访问或内存映射更优[^1][^2]。 通过上述方法,您可以根据项目需求选择合适的方式移动文件指针。如果您有具体场景(如二进制文件处理),可进一步优化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值