[C++语法语义探讨] 请帮忙解释一小段C++代码

zhangzuohai 2008-11-25
请帮忙解释一下这段代码,rail.txt的内容在下面贴出

ifstream in("rail.txt");//读取文件
for (int n,line=0;in>>n&&in.ignore();) {  //请解释下,if (int n,line=0;in>>n&n&in.ignore();)是什么意思
cout < <(line++ ? "\n":"");
for (string s;getline(in,s) && s!="0";){
istringstream sin(s);
stack <int> st;
for (int last=0,coach;sin>>coach;st.pop()){
for(int p=last+1;p <=coach;++p){
st.push(p);
}
if (last <coach) last=coach;
if (st.top()!=coach) break;
}
cout < <(!sin ? "Yes\n" : "No\n");
}
}

rail.txt
5
3 2 1 5 4
5 4 1 2 3
5 4 3 2 1
0
6
6 5 4 3 2 1
0
0
horizonhyg 2008-11-25
in是ifstream的一个对象,就像cin是istream的一个对象一样。ifstream是istream的子类,in这里代表标准文件输入流,也可以跟cin一样使用in>>进行输入。

ignore函数定义:istream&  ignore ( streamsize n = 1, int delim = EOF ),这个函数其实是istream里的函数,ifstream继承使用。故可以用in.ignore();
此函数从输入流(in)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到(streamsize n)或者被抛弃的字符是(delim定界符),则in.ignore()函数执行终止;否则,它继续等待。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。
如果in.ignore()不给参数,则默认参数为in.ignore(1,EOF),即把EOF前的1个字符清掉,没有遇到EOF就清掉一个字符然后结束,会导致不正确的结果,因为EOF是文件结束标识。
在这里每一行的结束符是\n,所以要用in.ignore();去掉一个字符,也就是\n。

希望上面的内容能对你有所帮助,如果有感觉不对的地方请指出来,大家相互学习。
netalpha 2009-02-12
我觉的这种代码就是为了恶搞用的  写的这么难懂  肯定没看过重构
zhangyafei_kimi 2009-03-25
我觉得一般吧,这么几行重构起来完全没工作量
Global site tag (gtag.js) - Google Analytics