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

时间:2015-11-29 17:46:34

标签: c++

现在我对使用c ++的行尾字符感到很困惑,我知道文本文件有一个行尾标记,用于设置读取单个shifing运算符的行的限制(>>) .Data连续读取,直到eol字符不显示,并且在文本模式下打开文件回车(CR)转换为CRLF,这是eol标记,所以如果我在我的文本中添加空格,那么它将作为eol制造商使它成为它确实

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

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

现在这个案例中的eol标记是什么

3 个答案:

答案 0 :(得分:3)

文件名末尾的“.txt”只是一个约定。它只是文件名的一部分

它并不表示文件的任何魔法属性,它肯定不会改变操作系统内核或文件系统驱动程序处理文件的方式。

简而言之,那有什么区别?的无。

  

我知道文本文件有一个行尾标记,用于设置读取单个shifing运算符(>>)

的行的限制

这是不正确的。

  

连续读取数据,直到eol字符不会显示

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

  

在文本模式下打开文件回车(CR)转换为CRLF,这是eol标记

转换可能会也可能不会发生,无论哪种方式,EOL都不是EOF。

  

如果我在我的文本中添加空格,那么它是否会像eol制作者那样起作用。

这是一个负面的明星命令。

我不确定你从哪里得到所有这些东西,但是你已经被大量误导了。我建议亚马逊推出一本关于计算机操作系统如何工作的好的,同行评审的,推荐的书。

答案 1 :(得分:0)

使用提取运算符>>在C ++中读取 strings 时,默认为跳过空格。

如果您想逐字逐行,请使用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;
}

答案 2 :(得分:0)

许多旧的和大型机操作系统都需要所有数据文件的记录结构,对于文本文件,它们来自80列的Hollerith(打孔)卡,并通过磁盘文件记录,磁带,输出打孔忠实保存卡片组和行打印机线。没有使用行结尾,因为记录结构要求每个记录有80列(并且通常填充空格)。在后来的几年(20世纪60年代+),具有80列最大值的可变长度记录变得流行。今天,即使OpenVMS仍然要求文件创建者指定文件格式(顺序,索引或&#34;流&#34;)和记录大小(固定,变量),其中必须提前指定最大记录大小。

在现代计算时代(有效地从Unix开始),强迫数据文件上的结构被广泛认为是一个坏主意。任何程序员都可以自由地执行此操作,并且有大量面向记录的数据格式,如编译器/链接器对象文件(.obj,.so,.o,.lib,.exe等)和大多数媒体格式( .gif,.tiff,.flv,.mov,mp3等。)

对于通信文本行,范例是针对终端或​​打印机,为此,应指示行结尾。大多数操作系统环境(MSDOS和Windows除外)使用以ASCII编码的\n字符作为换行符(ASCII 10)代码。 MSDOS和同类使用&#39; \ r \ n&#39;然后编码为回车符然后换行(ASCII 13,10)。两种方案都有优点和缺点。但是文本文件也可能包含其他控件,最常见的是ANSI escape sequences,它们以特定方式控制设备:

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

对于这些操作,线路结束不是问题。

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

回答你的问题:

  

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

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

  

设置读取单个shifing运算符(&gt;&gt;)的行的限制。

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

&#34;转移运营商&#34;文件流过载以输入或输出数据但与bit twiddling shifts无关。这些运算符被选择用于输入/输出的视觉近似,并且由于它们的运算符优先级较低。

  

连续读取数据,直到eol字符不会显示

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

  

并且在文本模式下打开文件时回车符(CR)被转换为CRLF,这是eol标记,所以如果我在我的文本中添加空格,那么它会作为eol制作者,因为它会这样做。

打开文件不会转换任何内容,但可以从文件中读取。但是,没有环境(我知道)将输入转换为CR LF。 MSDOS将输入的CR LF转换为\n

添加空格对行尾,文件结尾或其他任何内容都没有影响。空间只是数据。但是,C ++流操作读/写数字和一些其他数据类型使用空格(一系列空格,水平制表符,垂直制表符,换页符,可能还有其他一些)作为分隔符。这种便利功能可能会造成一些混乱。

  

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

     

ifstream的(&#34;测试&#34); \ no .txt

     

现在这个案例中的eol标记是什么

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