现在我对使用c ++的行尾字符感到很困惑,我知道文本文件有一个行尾标记,用于设置读取单个shifing运算符的行的限制(>>) .Data连续读取,直到eol字符不显示,并且在文本模式下打开文件回车(CR)转换为CRLF,这是eol标记,所以如果我在我的文本中添加空格,那么它将作为eol制造商使它成为它确实
现在我创建了一个普通文件,即没有.txt的文件 例如
ifstream("test"); // No .txt
现在这个案例中的eol标记是什么
答案 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
可能根本不是文本文件。使用特定的文件扩展名可以方便人们传达文件的目的,但这不是强制性的。