C++的文件输出有点怪

来源:百度知道 编辑:UC知道 时间:2024/05/27 17:20:52
void print(GLnode *L)
{
ofstream cout("Glist.out",ios::app);
if(L!=NULL)
{ if(L->tag==1)
{ if(L->hp->tag==1)cout<<'('<<endl;
print(L->hp);
if(L->tp!=NULL){cout<<","<<endl;print(L->tp);}
if(L->tp==NULL)cout<<')'<<endl;
}else cout<<L->atom<<endl;
}
}
你会发现我把每个输出后面加了endl,但若不回车,输出的顺序就被打乱了,总是先输L->atom,后输括号。。。是不是有什么输出流什么的#¥·……不太清楚。。
哪个大牛能告诉下,它是怎么输出的?
谢谢啦!!!!!此问题已纠结我超过10个多小时。。实在抗不住了。。
struct GLnode
{ int tag;
char atom;
struct GLnode *hp,*tp;
}* GList;
(刚看见... porker2008是要这个么?)
若不加endl,
01),2345)(),(),6)(,,7)89)(),()()(,(,(,
顺序都乱了。。
我希望得到我希望得到(0,1),(2,(3,(4,(5))),6),(7),((8,(9))))

恩,那既然只是存起来不输出,那也得按顺序存吧?可输出的顺序和存入的不一样。而且看那个输出,有的括号乱了,但

LZ试一下这个...

void print2(GLnode *L,ofstream& cout)
{
if(L!=NULL)
{
if(L->tag == 1)
{
cout << "(";
print2(L->hp);
cout << ")";
}
else
{
cout << L->atom;
}
if(L->tp != NULL)
{
cout << ",";
print2(L->tp);
}
}
}

int main()
{
//......
ofstream cout("Glist.out",ios::app);
//......
print2(...,cout);
//......
cout.close();
}

我提供一个想法……把每个要输出地符号先按顺序放到另一个新链表里。
然后统一输出……

你说的太对了!
C++中的endl和c中的回车是一个工作原理。当你输入一系列数据时,这些数据只是送到了键盘缓冲区并没有被读入到内存,只有按下enter(回车'\n')键或者读入endl后才表示一次输入结束,数据才允许送入内存供程序使用。
这就是输入流的特点。
对于输出,也有输出缓冲区。当程序向输出设备中输出数据时,输出的数据先被存放在计算机缓冲区(Buffer)内。当缓冲区存满时,这些数据才真正地输出到输出设备。但是,如果输出的字符序列中出现了endl控制符,那么缓冲区内的所有数据将立即输出到输出设备,而无论缓冲区是否已经存满。因此,endl控制符的作用是将光标移动到输出设备中下一行开头处