关于EOF和EOL的问题

时间:2011-07-25 14:10:57

标签: 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

为什么要这些价值?

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

  2. 在读取/写入一些以'\n'结尾的字符串句子的文件时,如果行以NULL字符结尾,这也代表行尾?会发生什么?< / p>

  3. 你能用例子简单解释一下这些吗?

3 个答案:

答案 0 :(得分:4)

  

通过getchar()中的getche()char进行输入   变量,我发现如果我写行:

char a; a = getche(); // it returns char '\r' if pressed enter
a = getchar();        // it returns char '\n' if pressed enter

首先,getche是来自conio.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);

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

  

在读/写文件时(有一些字符串句子结束   用\ n。然后如果行以null char结尾,也是如此   代表字符串的结尾?)。

空字符无关紧要。

空字符出现问题的唯一时间是C样式char缓冲区字符串,没有伴随长度信息。 确定字符串长度的唯一方法是搜索终止 null字符(请参阅:strlen),如果分散了任意其他空字符,则会出现问题整个有用的数据部分。

如果您将指向char数组的指针传递给int,那么它可以包含任意数量的空字符。< / p>

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

  

在写/ / char表示什么时,char代表行尾   阅读时输入线的结束?

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

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

现在,这种物理角色并未以这种方式使用,但操作系统和文件系统的内部将使用不同的机制来通知您的应用程序no more input。 C函数将返回宏EOF,并且C ++对象具有可以检查的状态标志。

具体如何运作的细节被抽象出来;你不应该关心它。

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


我希望这对你有所帮助。您的问题并不是特别清楚,但上述内容旨在简要介绍C ++中的EOL和EOF。

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

答案 1 :(得分:1)

你正在混合使用C和C ++。

C ++方式是like this

std :: string input;
while (std :: getline (input_stream, input)) {
     // Do stuff
}

std::getline返回input_stream,当输入用完或其他失败时,它会转换为布尔值false。在这里,“耗尽”意味着“遇到EOF”或某些类似的条件。

您也可以

std :: string input;
while (std :: getline (input_stream, input, delimiter)) {
     // Do stuff
}

如果默认'\n'不是正确的行终止符。

EOF is a special ASCII value是历史性的,与早期的打印机协议和终端黑客有关,现在只有在您使用getchar或其他此类古董时才有意义。

'\n'是UNIX标准的行尾字符。 Microsoft使用"\r\n"这是打印机的两条指令:将头部移动到行的开头,然后将纸张向上移动一行。 UNIX决定没有理由继续进入非打印文件的世界并放弃'\r'

答案 2 :(得分:0)

getchar和getche应该一次获得一个字符。应该没有“终点线”的概念。如果你用一个NULL字符结束你的行,你应该把它作为你读的字符。

当读取文件末尾时,您将获得特殊的EOF宏作为返回值。匹配以检测文件的结尾。如果你得到一个'\ n'或NULL,你可以根据你的文件解析它(即句柄作为一行文本的结尾)。

http://www.cplusplus.com/reference/clibrary/cstdio/getchar/

(不确定我曾经用过这个) http://msdn.microsoft.com/en-us/library/kswce429(v=vs.80).aspx