关于EOF和EOL的问题

Mr.*_*bis 1 c++ windows stdio

我试图了解 EOF 和 EOL,以及 C++ iostream 的实际工作原理。

在将输入通过getchar()或输入getche()char变量中时,我发现如果我写这样的行:

char a;
a =  getche();  // it returns char '\r' if pressed enter
a =  getchar(); // it returns char '\n' if pressed enter
Run Code Online (Sandbox Code Playgroud)

为什么是这些值?

  1. 实际上是什么让 C++ 认为我们已经用完了输入(即是否总是'\n'让 C++ 认为它在其输入的末尾?)。

  2. 在读/写一个以字符串结尾的文件时,'\n' 如果行以NULL字符结尾会发生什么,这也代表行尾?

你能用例子简要解释所有这些吗?

Lig*_*ica 6

而通过取该输入getchar()getche()char 可变的,我发现,如果我写入线这样的:

char a; a = getche(); // it returns char '\r' if pressed enter
a = getchar();        // it returns char '\n' if pressed enter
Run Code Online (Sandbox Code Playgroud)

首先,getcheconio.h非标准的 POSIX 函数,并且在所有主要工具链中都不推荐使用。

这是一个无缓冲、非格式化的读取操作。当您的输入流\r\n用于行尾(在 Windows 上很常见)时,您正在读取第一个字符\r.

当您执行 时getchar(),您将获得第二个字符\n。这也是一个 C 函数。

我的其余答案将与 C++ 有关。

实际上是什么让 c++ 认为我们不会提供任何输入(即它总是 \n 使 c++ 认为它的输入结束?)。

缓冲的 I/O 函数倾向于将读取分隔为\n,是的。有一个参数std::getline允许您更改此分隔符:

std::istream& std::getline(std::istream& is, std::string& str);
std::istream& std::getline(std::istream& is, std::string& str, char delim);
Run Code Online (Sandbox Code Playgroud)

但这只是一个分隔符。您可能认为它表示“行尾”,但它肯定不是“文件尾”。

在读取/写入文件时(其中有一些以 \n 结尾的字符串句子。那么如果行以 null char 结尾呢?这也代表字符串的结尾?)。

空字符无关紧要。

只有在char没有附带长度信息的C 样式缓冲区字符串中,空字符才会出现问题。确定字符串长度的唯一方法是搜索终止的空字符(请参阅strlen:),如果在数据的有用部分中散布着任意其他空字符,则这是有问题的。

如果你身边掠过的指针,char数组其作为一个规模int,那么它可以包含多达空字符只要你喜欢。

从流中读取字符时,在 CC++ 中,您使用的函数会告诉您读取了多少个字符。所以,即使其中一些是空字符,也没关系。您可以根据需要处理它们。

什么字符表示写入时行尾/什么字符表示读取时行尾输入?

我不太明白这个问题,但我将通过简要描述文件结尾来结束我的回答。

从历史上看,文件有一个物理字符\004( ^D),位于其内容的末尾并表示文件结束。

现在这个物理字符不再以这种方式使用,但是操作系统和文件系统的内部将使用不同的机制来通知您的应用程序没有更多的输入。C 函数将返回宏EOF,并且 C++ 对象具有您可以检查的状态标志。

确切地说,这是如何工作的细节是从你那里抽象出来的;你不应该关心它。

有趣的是,要在 Linux 控制台中结束输入^D,您仍然需要按下键盘。


我希望这对你有所帮助。您的问题不是特别清楚,但以上旨在简要说明 C++ 中的 EOL 和 EOF。

我可以推荐这些书籍和资源以供进一步阅读。