读取文件函数如何识别C+中文本文件的结尾+;? P.>根据你所知,C++中有两个标准来读取文本文件(在这种情况下,每行中有2个数字):

读取文件函数如何识别C+中文本文件的结尾+;? P.>根据你所知,C++中有两个标准来读取文本文件(在这种情况下,每行中有2个数字):,c++,memory-management,text-files,C++,Memory Management,Text Files,这两种标准方法是: 假设每行由2个数字组成,并逐个令牌读取: #include <fstream> std::ifstream infile("thefile.txt"); int a, b; while (infile >> a >> b) { // process pair (a,b) } 我的问题是: 问题1:此函数如何理解一行是最后一行 线路?我的意思是“如何eof()返回false\true?” 据我所知,他们阅读了一部分记忆。问题

这两种标准方法是:

假设每行由2个数字组成,并逐个令牌读取:

#include <fstream>
std::ifstream infile("thefile.txt");    
int a, b;
while (infile >> a >> b)
{
    // process pair (a,b)
}
我的问题是:

问题1:此函数如何理解一行是最后一行 线路?我的意思是“如何
eof()
返回false\true?”

据我所知,他们阅读了一部分记忆。问题是什么 属于文件的零件与零件之间的差异 不是吗

问题2:是否存在欺骗此函数的行为?!我是说,是吗 可以在文本文件中间添加一些内容(例如) 并使
eof()
在 文本文件的中间

感谢您的时间和考虑

问题1:此函数如何理解一行是最后一行?我的意思是“eof()如何返回false\true?”

没有。函数知道您何时尝试读取文件中最后一个字符。他们不一定知道一行是否是最后一行。“文件”不是您可以通过流读取的唯一内容。键盘输入、专用设备、互联网插座:所有这些都可以通过正确的I/O流读取。当从标准输入读取时,流不知道我输入的下一个内容是否是control-Z

对于计算机磁盘上的文件,大多数现代操作系统都将有关文件的元数据与文件分开存储。这些元数据包括文件的长度(通常包括文件上次修改和上次读取的时间)。在这些系统上,位于I/O流下面的流缓冲区知道文件中的当前读取位置,并知道文件的长度。当读取位置达到文件长度时,流缓冲区发出EOF信号

然而,这并不普遍。有些不太常见的操作系统不使用这种存储在别处的元数据概念。在这些系统中,磁盘上的文件结尾和键盘上用户输入的文件结尾一样令人惊讶

据我所知,他们阅读了一部分记忆。属于该文件的部分与不属于该文件的部分有什么区别

了解内存和磁盘文件之间的区别。这两者之间有着巨大的差异。除非您使用的是嵌入式计算机,否则内存远比磁盘空间有限

问题2:是否存在欺骗此函数的方法?!我的意思是,是否可以在文本文件的中间添加一些东西(例如用十六进制编辑器工具),使EOF()错误地返回到文本文件的中间? 这在很大程度上取决于操作系统如何实现文件。在大多数现代操作系统上,答案不仅仅是“不”,而是“不!”。在磁盘文件中使用某种表示文件结尾的特殊签名的概念是许多计算机科学概念中的一个,这些概念在很大程度上已经被抛到了一堆“那不是很聪明”的想法中。你在网上问了你的问题。这很可能意味着您正在使用Windows计算机、Linux计算机或Mac。它们都将文件的长度存储为与文件内容分开的元数据


但是,需要能够清除文件结束指示器。一个程序可能正在写入文件,而另一个程序正在读取文件。当写入程序仍处于活动状态时,读取器可能会点击EOF。读卡器需要清除EOF指示器才能继续阅读写卡器所写的内容。C++ I/O流提供了这样做的能力。每个I/O流都有一个清除功能。不管它是否有效,那都是另一回事。清除将暂时工作,但下一次读取可能会重置EOF位。例如,当我在键盘上键入control-Z时,这意味着我已经完成了与程序的交互,句号,我的下一个动作很可能是出去吃午饭。

读这篇文章,它不明白最后一行是什么。事实上,它通过了最后一行。如果它尝试读取,但没有更多的字符可读取,则EOF设置为true。是否询问文件是否可以包含文本以及一些隐藏的二进制数据,而这些数据不是文本流的一部分?您可能需要“备用数据流”(Windows)或“资源分叉”(Mac)您不是在读取内存的一部分,而是在读取文件。操作系统会跟踪文件的大小,并且不会让程序读取超过文件末尾的内容。C++运行时库检测此条件,并在发生时在流上设置EOF标志。当您更改文件时,OS更新元数据。如果向文件中添加字符,则会增加长度。如果更改文件的权限,它会更新权限模式。OS可能有存储长度的元数据,但不能保证OS文件“文件结束”的思想是C++运行时库使用的唯一标准。在文本模式转换处于活动状态下打开文件时,某些实现确实会识别“文本结束”类型的标记。这些实现在现代OSES中遇到。@ Beoviigt -我希望我没有给人的印象是,EOF的OS思想是C++库用来确定流缓冲区向I/O流发出信号的唯一标准。首先,这非常依赖于实现。另一方面,从标准I/O流和流缓冲区继承来实现分区文件(物理文件中的多个逻辑文件)的自定义I/O流和流缓冲区将无法工作。但它确实有效,因为标准没有说明EOF是如何存储或发出信号的。好吧,你说在大多数现代操作系统上,答案不仅仅是“不”,而是“不!”。
#include <sstream>
#include <string>
#include <fstream>
std::ifstream infile("thefile.txt");

std::string line;
while (std::getline(infile, line))
{
    std::istringstream iss(line);
    int a, b;
    if (!(iss >> a >> b)) { break; } // error

    // process pair (a,b)
}
while (!infile.eof())