上面都是学c的吧 呵呵 还是我来说这个c++问题吧
ctrl+z是结束符 文件结束符 并不是让cin结束 如果你理解的深点的时候你就明白了 它只不过是让cin变为bad()而已
这点是有点质疑的 你在输入1 2 3 之后回车 再ctrl+z 然后再来一次 也就是两次ctrll+z
它才会结束的 我以前也不明白 为什么需要两次ctrl+z才行 人们好像说是一个bug
Windows系统中一般采用阻塞式检查 Ctrl+Z、Unix/Linux系统下一般采用非阻塞式的检查 Ctrl+D。楼主是在Windows系统下,因此使用阻塞式的 Ctrl+Z 来标识流的结束。
这种阻塞式的方式有一个特点:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。还有一个特点就是:如果输入缓冲区中有可读的数据则不会 检测Ctrl+Z(因为有要读的数据,还不能认为到了流的末尾)。还有一点需要知道:Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的 不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。明白了这几点之后就可以来解释楼主提出的问题了。
从键盘上输入abcd^z 加 回车之后在Windows系统上是这样处理的:由于回车的作用,前面的 abcd 等字符被送到输入 缓冲区(注意:上面说过了,^z不会产生字符,所以更不会存储到输入缓冲区,缓冲区中没有 ^z 的存在)。这时,cin.get() 检测 到输入缓冲区中已经有数据存在(因此不再检查是否有 ^z 的输入),于是从缓冲中读取相应的数据。如果都读取完了,则输入缓冲区重新变为空, cin.get() 等待新的输入。可见,尽管有 ^z 按下,但是由于在此之前还有其它输入字符(abcd),所以流也不会结束。
因此,输入流结束的条件就是:^z 之前不能有任何字符输入(回车除外),否则 ^z 起不到流结束的作用。
这点你不需要太在意 它的目的就在于让输入停止 所以不要太抠门了
一个文件,就是一个单元,是一组相关数据的有机结合,操作系统通过一定的方式访问文件,以存取数据。
C++中是通过流的方式来访问文件的,比如说语句 ifstream in("str.txt",ios::in); ,就打开了文件str.txt。我们可以通过in.read()来读取流in(也就是文件str.txt)中的数据。现在问题来了:怎么判断何时读到了这个文件的末尾呢?
在C++中,文件的结束标志是EOF——顾名思义,End Of File。也就是说,在文件的某个字节b后面加入一个EOF,就表示这个字节b就是该文件的最后一个字节了。这里顺便说一句,EOF占一个字节的大小,其值为-1。
举个例子!——运行环境为Microsoft Visual C++ 2005。
#include
#include
using namespace std;
int main()...{
char c='a';
ofstream out("str.txt",ios::out);
for(int i=0;i<10;i++,c++)
out.write(&c,sizeof(char));
out.close();
int i=0;
ifstream in("str.txt",ios::in);
while(in)...{
c=in.get();
cout<
}
cout<
cin.get();
}
在in读完字符'j'的时候,其实已经到达文件的末尾了,但此时流in的状态还是good,也就是说还可以继续读入下一个字节。而当in继续往下读的时候,就会读到EOF了,当读完EOF并赋值给c后,流in的状态就变成了eofbit,不可再读,在条件判断语句中流in也就成了false了。所以真正读入的字节数其实是11,而不是文件的长度10。
而文件的输出为 abcdefghij11 ,用UltraEdit打开,切换到16进制模式下可以看到,j和11中间的那个空格的ASCII码为FF,也就是2进制的11111111,就是-1的补码。
应该是这样的
程序是在dos下运行的
要输入字符串
结尾用ctrl+ z结束。
就是这样的,这是WINDOWS的字符结束符号,
在程序中是这样的
while(scanf("%s",&i)!=eof)
文件的结束符是EOF。默认的。
你怎么试的呢?
我不知道c++primer上怎么说的, 不过一般程序里按ctrl-z应该也不会打出结束符的, 所谓ctrl-z等于结束符应该就是在console下输入时才是这样的
在缓冲模式下回车这个动作有特殊的意义, 除了输出回车字符之外还有清缓冲的功能。而没回车的话数据都在缓冲里,程序根本没处理到。 所以这个不输入回车是没戏的。
就你这个程序, ctrl-z虽然没结果, 但是再回车就有结果了。 你可以试一下 如果 ctrl-z后面再输入个数字, 那个数字是读不到的