Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们能自己写一个EOF字符吗? 大多数语言,如C++,当写入文件时,即使不写诸如“”语句,也会放置EOF字符。_C++_Eof - Fatal编程技术网

我们能自己写一个EOF字符吗? 大多数语言,如C++,当写入文件时,即使不写诸如“”语句,也会放置EOF字符。

我们能自己写一个EOF字符吗? 大多数语言,如C++,当写入文件时,即使不写诸如“”语句,也会放置EOF字符。,c++,eof,C++,Eof,filestream.close 但是,有任何方法,我们可以根据我们的要求,在C++中,将EOF字符放在一个实例中。 或者除了使用C++中提供的函数之外,我们可以使用任何其他方法。 如果您需要询问更多信息,请给出评论 提前谢谢 编辑:感谢您的支持,但这是对这个问题的补充: 如果我们想欺骗操作系统,在文件中放置一个EOF字符,并在EOF之后写入一些数据,这样像notepad.exe这样的应用程序就无法读取EOF字符之后的数据。 我已经阅读了与此主题相关的问题的答案,并了解到现在的操作系统通常不会查

filestream.close

但是,有任何方法,我们可以根据我们的要求,在C++中,将EOF字符放在一个实例中。 或者除了使用C++中提供的函数之外,我们可以使用任何其他方法。 如果您需要询问更多信息,请给出评论

提前谢谢

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

如果我们想欺骗操作系统,在文件中放置一个EOF字符,并在EOF之后写入一些数据,这样像notepad.exe这样的应用程序就无法读取EOF字符之后的数据。 我已经阅读了与此主题相关的问题的答案,并了解到现在的操作系统通常不会查看EOF字符,而是检查文件的长度以获得了解文件长度的正确想法,但是,操作系统中必须有一个检查文件长度的过程,然后更新文件记录


对不起,如果我在估计的任何一点上都错了,请帮助我,因为它会带来很多新的想法。

< P>如果EOF字符是指像控制Z一样的东西,那么现代操作系统就不需要这样的东西,C++运行时不会为你写一个。你当然可以自己写一个:

 filestream.put( 26 );     // write Ctrl-Z
但没有充分的理由这样做。也没有必要这样做:

 filesystem.close();

因为当调用文件流的析构函数时,文件流将自动关闭,但是(我认为)这样做是一个好的做法。

没有EOF字符。EOF定义为“不等于任何有效字符代码”。通常是-1。它在任何时候都不会写入文件

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


回答Apoorv的后续问题:操作系统从不使用文件数据来确定文件长度(文件在任何情况下都不会以“空终止”)。所以你不能欺骗操作系统。也许旧的、愚蠢的程序不会在CTRL+Z字符后读取。我不认为任何Windows应用程序(甚至记事本)都会这样做。我猜用一个空(<代码> 0个/COD>)字符来欺骗它们会更容易。

< P>实际上,在C++中,没有使用FPROTFF()或OFSUM机制将物理EOF字符写入文件。EOF是一种I/O条件,指示不再读取数据


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

那么,
EOF
只是由C
stdio.h
头文件中定义的函数返回的值。它实际上由操作系统返回到所有的读取功能,因此它依赖于系统。当操作系统到达文件末尾时,它会将其发送到函数,该函数的返回值比最常见的位置(
-1
)要高,但并不总是如此。因此,总而言之,
EOF
不是字符,而是操作系统返回的常量。 编辑:嗯,您需要更多地了解文件系统,看看

嗨,关于你的第二个问题:

同样,您应该更好地研究
文件系统
。FAT是一个很好的例子,因为你可以找到很多关于它的文章,它的原理与NTFS非常相似。无论如何,EOF再一次不是一个字符。不能直接将其放入文件中。如果可以这样做,想象一下后果,即使是“哑”图像文件也无法被系统读取

为什么??因为操作系统的工作原理类似于非常复杂的层结构。其中一层是文件系统驱动程序。它确保从驱动程序已知的每个文件系统传输数据。它在应用程序和将文件存储到HDD的实际系统之间提供了一座桥梁

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

因此,它会将文件的第一部分写入其中。然后,它在FAT中查找另一个“0x0”值,如果找到,它会将文件的第二部分写入它所指向的集群。然后,它将文件所在的第一个FAT表记录的值更改为文件第二部分的下一个FAT表记录的物理地址

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


所以,现在你看,如果你想手动将EOF值写入它不属于的地方,你必须编写你自己的驱动程序,它能够重写FAT记录,但这对于初学者来说几乎是不可能的。

在现代文件系统中,EOF不是一个字符,因此,您不必在完成写入文件时发出它。您只需在进程终止时关闭文件或让操作系统帮您完成即可。

我是在进行Kernighan&Ritchie C练习时来到这里的

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


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

没有“EOF”字符。c的事实
#include <io.h>
#include <fcntl.h>
...
_setmode(0, _O_BINARY)
vi filename.txt