关于EOF和EOL的问题

Questions about EOF and EOL

本文关键字:问题 EOL EOF 关于      更新时间:2023-10-16

我正在尝试理解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++认为我们已经耗尽了输入(i) ?)

  2. 当读/写一个文件,有一些字符串句子以'n'结束,然后发生什么,如果行以NULL字符结束,这也表示行结束?

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

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

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

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

这是一个非缓冲的、非格式化的读操作。当你的输入流使用rn作为行结尾时(在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。那么,如果行以空字符结尾,这也表示字符串结束?).

空字符不重要。

空字符唯一的问题是在没有附带长度信息的c风格char缓冲区字符串中。确定字符串长度的唯一方法是搜索结尾的空字符(参见:strlen),如果在数据的有用部分中分散有任意其他空字符,则会出现问题。

如果你传递一个指向char数组的指针,并且的大小与int相同,那么它可以包含任意多的空字符。

当从流中读取字符时,在C c++中,使用的函数会告诉您读取了多少字符。所以,即使其中一些是空字符,也没关系。你可以按你认为合适的方式处理它们。

什么char表示行结束,而写/什么char表示读取时输入行结束?

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

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

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

这是如何工作的具体细节是从你抽象出来的;你不必关心它。

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


我希望这对你有所帮助。你的问题不是特别清楚,但以上是对c++中的EOL和EOF的简要描述。

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

你混合C和c++。

c++的方法是这样的:
std :: string input;
while (std :: getline (input_stream, input)) {
     // Do stuff
}

std::getline返回input_stream,当输入耗尽或其他错误时,CC_27将转换为布尔值false。在这里,"run out"是指"遇到EOF"或类似的情况。

你也可以做

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

如果默认的'n'不是正确的行结束符。

EOF是一个特殊的ASCII值,它是历史上的,与早期的打印机协议和终端黑客有关,现在只有当你使用getchar或其他类似的古董时才重要。

'n'是UNIX标准的行结束字符。微软使用"rn",这是对打印机的两个指令:将头部移动到行首,并将纸张向上移动一行。UNIX决定没有理由继续在非打印文件的世界中使用,并删除了'r'

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