首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于EOF和EOL的几个问题

关于EOF和EOL的几个问题
EN

Stack Overflow用户
提问于 2011-07-25 14:10:57
回答 3查看 6.6K关注 0票数 1

我正在尝试理解EOF和EOL,以及C++ iostream实际上是如何工作的。

在将输入通过getchar()getche()输入到char变量时,我发现如果我编写如下行:

代码语言:javascript
运行
复制
char a;
a =  getche();  // it returns char '\r' if pressed enter
a =  getchar(); // it returns char '\n' if pressed enter

为什么是这些价值?

  1. 究竟是什么让C++认为我们已经没有输入了(,即总是使C++认为它在输入的末尾?)。
  2. 当读取/写入一个具有以'\n'结尾的字符串语句的文件时,如果行以NULL字符结尾,这也表示行尾,会发生什么情况?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-25 14:27:41

在通过getchar()getche()char变量中输入时,我发现如果我写行如下: char a;a= getche();//如果按下,它返回char '\r‘,如果按下enter,返回char’\r‘;//如果按下enter,则返回char '\n’。

首先,getche是来自conio.h的POSIX函数,在所有主要工具链中都是不标准的,不受欢迎。

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

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

我其余的答案将是关于C++。

是什么让c++认为我们不会提供任何输入(也就是说,它总是\n使得c++认为它的输入结束了?)

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

代码语言:javascript
运行
复制
std::istream& std::getline(std::istream& is, std::string& str);
std::istream& std::getline(std::istream& is, std::string& str, char delim);

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

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

空字符不重要。

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

如果您正在传递指向char数组的指针及其大小为int的指针,那么它可以包含任意数量的空字符。

在C或C++中从流中读取字符时,使用的函数将告诉您读取了多少个字符。因此,即使其中一些是空字符,也不重要。你可以随心所欲地处理。

什么字符代表写时行的末尾/什么字符代表阅读时行的输入结束?

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

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

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

这个工作的细节是从你身边抽象出来的,你不应该去关心它。

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2011-07-25 14:18:30

你把C和C++混合在一起。

C++的方式是像这样

代码语言:javascript
运行
复制
std :: string input;
while (std :: getline (input_stream, input)) {
     // Do stuff
}

std::getline返回input_stream,当输入耗尽或其他东西失败时,它将转换为布尔false。在这里,"runs out“意思是”遇到EOF“或一些类似的条件。

你也可以

代码语言:javascript
运行
复制
std :: string input;
while (std :: getline (input_stream, input, delimiter)) {
     // Do stuff
}

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

EOF是一个特殊的ASCII值。是历史悠久的,它与早期的打印机协议和终端黑客有关,现在只有当您使用getchar或其他此类古董时才会起作用。

'\n'是UNIX标准的行尾字符.微软使用"\r\n",这是对打印机的两条指令:将头移至行首,并将纸张向上移动一行。UNIX决定,没有理由让这种情况继续存在于非打印文件的世界,并放弃了'\r'

票数 1
EN

Stack Overflow用户

发布于 2011-07-25 14:21:47

getchar和getche应该一次得到一个字符。不应该有“线的结尾”的概念。如果以空字符结束行,则应将其作为所读字符返回。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6817441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档