我试图了解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

为什么要这些值?
  • 是什么实际上使C++认为我们用完了输入(,即总是使'\n'使得C++认为它在其输入的末尾吗?)。
  • 在读取/写入一个包含一些以'\n'结尾的字符串语句的文件时,如果行以NULL字符结尾(也代表行尾),会发生什么情况?

  • 您可以通过示例简单地解释所有这些吗?

    最佳答案



    首先,getcheconio.h的POSIX函数,它是非标准的,并且在所有主要工具链中均已弃用。

    这是一个无缓冲,无格式的读取操作。当您的输入流使用\r\n作为行尾时(在Windows中是常见的),那么您正在读取第一个字符\r

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

    我的其余答案将与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);
    

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



    空字符无关紧要。

    空字符唯一的问题是C型char缓冲区字符串中没有伴随的长度信息。确定字符串长度的唯一方法是搜索终止的空字符(请参见:strlen),如果在数据的有用部分中还散布着其他任意的空字符,这将是一个问题。

    如果您要传递一个指向char数组的指针及其大小作为int,则它可以包含任意多个空字符。

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



    我不太理解这个问题,但是我将通过简要描述文件结束来总结我的答案。

    从历史上看,文件的物理字符\004(^D)位于其内容的末尾并表示End Of File。

    如今,这种物理特性并未以这种方式使用,但是OS和File System的内部将使用各种机制来通知您的应用程序no more input。 C函数将返回宏EOF,并且C++对象具有可以检查的状态标志。

    确切的工作原理细节已从您身上抽象出来;您不必关心它。

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

    我希望这对您有所帮助。您的问题不是特别清楚,但是以上内容只是为了简要介绍C++中的EOL和EOF。

    我可以推荐these books and resources进行进一步阅读。

    关于c++ - 关于EOF和EOL的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6817441/

    10-12 00:39
    查看更多