文本文件和普通文件中的Eol是什么

What is Eol in text file and normal file?

本文关键字:文件 Eol 是什么 文本      更新时间:2023-10-16

现在我对我使用c++时的行尾字符感到非常困惑,我知道文本文件有一个行尾标记,它设置了单个shiffing运算符(>>)读取一行的限制。数据被连续读取,直到eol字符不存在,并且在文本模式下打开文件时,回车(CR)被转换为作为eol标记的CRLF在我的文本中添加空白,那么它会充当eol的制造者吗。

现在我创建了一个正常的文件,即没有.txt的文件例如

 ifstream("test"); // No .txt

在这种情况下,什么是eol标记

文件名末尾的".txt"只是一种约定。它只是文件名的部分。

它并不意味着文件有任何神奇的特性,当然也不会改变操作系统内核或文件系统驱动程序处理文件的方式。

那么,简而言之,有什么区别呢


我知道文本文件有一个行尾标记,它设置了单个屏蔽操作员(>>)读取一行的限制

这是不正确的。

数据被连续读取,直到eol字符不适用于

也不正确。一些操作系统(例如Windows IIRC)将EOF(而不是EOL!)字符注入流中,以向调用应用程序表示没有更多数据可读取。其他操作系统甚至不这么做。但在这两种情况下,实际文件的末尾都没有实际的EOF字符。

当以文本模式打开文件时,回车(CR)被转换为CRLF,它是eol标记

这种转换可能会发生,也可能不会发生,不管怎样,EOL都不是EOF。

如果我在文本中添加空白,那么它会充当eol生成器吗。

这是一个消极的、星形的命令。

我不确定你是从哪里得到这些东西的,但你大错特错了。我建议亚马逊写一本关于计算机操作系统如何工作的、经过同行评审的、推荐良好的书。

在C++中使用提取运算符>>读取字符串时,默认情况是跳过空格。

如果希望整行都一字不差,请使用std::getline

典型的输入回路是:

int main(void)
{
  std::string text_from_file;
  std::ifstream input_file("My_data.txt");
  if (!input_file)
  {
    cerr << "Error opening My_data.txt for reading.n";
    return EXIT_FAILURE;
  }
  while (input_file >> text_from_file)
  {
    // Process the variable text_from_file.
  }
  return EXIT_SUCCESS;
}

许多旧的大型机操作系统都需要所有数据文件的记录结构,对于文本文件,这些数据文件源自80列的Hollerith(穿孔)卡,并通过磁盘文件记录、磁带、输出穿孔卡组和行式打印机行忠实地保存。没有使用行尾,因为记录结构要求每条记录有80列(通常用空格填充)。在后来的几年(20世纪60年代以上),拥有最多80列的可变长度记录变得流行起来。如今,即使是OpenVMS仍然要求文件创建者指定文件格式(顺序、索引或"流")和记录大小(固定、可变),其中必须提前指定最大记录大小。

在现代计算时代(实际上始于Unix),人们普遍认为在数据文件上强制使用结构是个坏主意。任何程序员都可以自由地自己做这件事,并且有很多面向记录的数据格式,如编译器/链接器对象文件(.obj、.so、.o、.lib、.exe等),以及大多数媒体格式(.gif、.tif、.flv、.mov、mp3等)

对于通信文本行,范例是以终端或打印机为目标,为此,应该指示行结尾。大多数操作系统环境(MSDOS和Windows除外)都使用以ASCII编码的n字符作为换行(ASCII 10)代码。MSDOS和ilk使用"\r\n",编码为回车后换行(ASCII 13,10)。这两种方案都有优点和缺点。但文本文件也可能包含其他控件,最常见的是以特定方式控制设备的ANSI转义序列:

  • 部分或全部清除屏幕
  • 弹出打印机页面、跳过某些行、反向进纸和其他很少使用的功能
  • 建立滚动区域
  • 更改文本颜色
  • 选择字体、文本权重、页面大小等

对于这些操作,行结束不是一个问题。

此外,用ASCII编码的数据文件,如JSON和XML(尤其是嵌入Javascript的HTML),可能没有任何行结尾,尤其是在数据被模糊或压缩时。


回答您的问题:

我对我使用c++时的行尾字符很困惑,我知道文本文件有一个行尾标记

也许吧。也许不是。从C或C++程序的角度来看,编写n向运行时环境指示一行的结束。系统对此所做的操作因运行时操作环境而异。对于Unix和Linux,不会发生转换(尽管写入类似终端的设备会转换为rn)。在MSDOS中,"\n"被翻译为rn。在OpenVMS中,将删除"\n",并设置该记录的大小。阅读是反译。

它设置了读取单个屏蔽运算符(>>)的行的限制。

没有这样的限制:如果程序愿意,可以选择逐字节读取数据,也可以忽略行边界。

"移位运算符"是为文件流重载的,用于输入或输出数据,但与比特旋转移位无关。选择这些运算符是为了对输入/输出进行视觉近似,并且由于它们的运算符优先级较低。

数据被连续读取,直到eol字符不适用于

这一点令人困惑:我认为您的意思是直到eol字符出现,这确实是面向行的函数gets()fgets()的工作方式。

在文本模式下打开文件时,回车(CR)被转换为CRLF,它是eol标记,所以如果我在文本中添加空格,它会充当eol标记吗。

打开文件不会转换任何内容,但从文件中读取可能会转换。然而,没有任何环境(据我所知)将输入转换为CR LF。MSDOS在输入上将CR LF转换为n

添加空格对行尾、文件尾或任何内容都没有影响。空间只是数据。然而,读/写数字和其他一些数据类型的C++流操作使用空格(一系列空格、水平制表符、垂直制表符、表单提要,也许还有其他一些)作为分隔符。此便利功能可能会引起一些混淆。

现在我创建了一个正常的文件,即没有.txt的文件,例如

ifstream("测试");\无.txt

在这种情况下,什么是eol标记

文件名不是决定文件类型。事实上,file.txt可能根本不是一个文本文件。使用特定的文件扩展名可以方便地传达文件的目的,但这不是强制性的。