我们可以自己写一个EOF角色吗?

Apo*_*ena 39 c++ eof

大多数语言如C++在写入文件时,即使我们错过编写如下语句,也会输入EOF字符:

filestream.close

但是有什么办法,我们可以根据我们的要求,在C++中为一个实例放置EOF字符.或者除了使用C++中提供的函数之外我们可以使用的任何其他方法.

如果您需要询问更多信息,请发表评论.

提前致谢.

编辑:感谢您的支持,但这里是这个问题的补充:

如果,我们想欺骗OS和放置一个EOF字符的文件和EOF了一些数据后写了这么像的notepad.exe应用程序不能我们EOF字符后阅读.我已阅读的答案与此主题相关的问题,并已经开始知道nowdays OS一般看不到一个EOF字符,而检查文件的长度让知道关于该文件的长度,但正确的想法,有必须在OS的程序,其将被检查的文件的长度,然后更新所述文件中的记录.

我很抱歉,如果我错了,在我估计任何一点,但请你帮我,因为它可以导致很多新的想法.

ypn*_*nos 52

没有EOF角色.根据定义,EOF"不等于任何有效的字符代码".通常是-1.它不会在任何时候写入文件.

DOS中有一个历史EOF字符值(CTRL + Z),但它现在已经过时了.

要回答Apoorv的后续问题:操作系统从不使用文件数据来确定文件长度(文件不以任何方式"空终止").所以你不能欺骗操作系统.也许旧的,愚蠢的程序在CTRL + Z字符后不会读取.我不认为任何Windows应用程序(甚至记事本)都会这样做.我的猜测是用null(\0)字符欺骗它们会更容易.

  • 我只解释了EOF实际上是什么,而且它不是字符代码.我没有看到答案的问题. (9认同)

B.G*_*ill 14

好吧,EOF它只是C stdio.h头文件中定义的函数返回的值.它实际上由操作系统返回到所有读取功能,因此它依赖于系统.当操作系统到达文件末尾时,它会将其发送到函数,该函数的返回值比最常见的(-1),但并非总是如此.因此,总结一下,EOF不是字符,而是由OS返回的常量.编辑:嗯,你需要了解更多关于文件系统的信息,看看这个.

嗨,你的第二个问题:

再一次,你应该好好看看filesystems.FAT是一个很好的例子,因为你可以找到很多关于它的文章,它的原理与NTFS非常相似.无论如何,EOF再一次NOT a character.您不能直接将其放在文件中.如果你能这样做,想象一下后果,甚至系统都无法读取"哑"的图像文件.

为什么?Becouse OS就像非常复杂的层结构一样.其中一个层是文件系统驱动程序.它确保它从驱动程序已知的每个文件系统传输数据.它提供了应用程序和将文件存储到HDD中的实际系统之间的桥梁.

确切地说,FAT文件系统使用所谓的FAT表 - 它是一个靠近HDD(或分区)地址空间开头的表,它包含所有集群(小存储单元)的映射.好的,现在,当你想将一些文件保存到HDD时,OS(文件系统驱动程序)会查看FAT表,并搜索值"0x0".这个"0x0"值告诉操作系统该群集哪个地址由FAT表中该值的位置描述可以自由写入.

所以它写入文件的第一部分.然后,它在FAT中查找另一个"0x0"值,如果找到,它会将文件的第二部分写入它指向的簇中.然后,它将文件所在的第一个FAT表记录的值更改为文件第二部分中下一个的物理地址.

当您的文件全部存储在HDD上时,现在出现最后一部分,它会将所需的EOF值写入FAT表,而不是写入HDD的"数据部分".因此,当下次读取文件时,它知道这是结束,不要再看了.

所以,现在你看,如果你想手动将EOF值写入它不属于的地方,你必须编写自己的驱动程序,它能够重写FAT记录,但这实际上是不可能的. begginers.


chb*_*own 13

我在经历Kernighan&Ritchie C练习时来到这里.

Ctrl+ D发送与EOF常量匹配的字符stdio.h.

(编辑:这是在Mac OS X上;感谢@markmnl指出Windows 10等效于Ctrl+ Z)


Ama*_*9MF 7

实际上在C++中,没有使用fprintf()或ostream机制将文件写入文件的物理EOF字符.EOF是一种I/O条件,表示无法读取更多数据.

一些早期的磁盘操作系统(如CP/M)实际上确实使用了物理0x1A(ASCII SUB字符)来指示EOF,因为文件系统只保留了块中的文件大小,因此您永远不知道文件的确切长度(以字节为单位).随着在目录中存储实际长度计数的出现,不再典型地将"EOF"字符存储为"带内"文件数据的一部分.


zwo*_*wol 5

还没有人提到[f]truncate系统调用,这是您如何缩短文件而不从头开始重新创建文件的方法。

和函数导致由 命名或由 引用的常规truncate()文件被截断为精确字节的大小。ftruncate()pathfdlength

如果文件以前大于此大小,则多余的数据将丢失。如果文件之前较短,则会对其进行扩展,并且扩展部分读取为空字节 ( '\0')。

请理解,这是与将任何类型的数据写入文件不同的操作。该文件是一个字节的线性数组,以某种方式放置在磁盘上,元数据表明它有多长;truncate更改元数据。


Mal*_*ous 5

在Windows下,如果在stdin中遇到ASCII 26(EOF),它将停止读取其余数据.我相信写这个字符也会终止发送到stdout的输出,但我还没有证实这一点.您可以将流切换到二进制模式,如此SO问题:

#include <io.h>
#include <fcntl.h>
...
_setmode(0, _O_BINARY)
Run Code Online (Sandbox Code Playgroud)

并且您不仅会停止将0x0A转换为0x0D 0x0A,而且还可以获得读/写0x1A的能力.请注意,您可能必须同时切换stdin(0)和stdout(1).