QTextStream采用QIODevice::Append模式写入含 的文件失败
解决QTextStream写入文件为空的问题
你的代码能成功创建文件但内容为空,核心原因是QTextStream的缓冲区没有被同步到磁盘——Qt的文本流默认会缓冲写入的数据,除非主动触发刷新、关闭文件,或者文件对象被销毁,否则内容会一直留在内存里,不会真正写到磁盘中。
另外你代码里先调用fi.remove()再用QIODevice::Append模式打开其实没问题(Append模式会自动创建不存在的文件),但关键就差了缓冲区同步的步骤。
这里给你两种简单的修复方案:
方法1:显式刷新缓冲区并关闭文件
在写入完成后,手动调用flush()把缓冲区内容刷到磁盘,再关闭文件即可:
QFile fi(QString("result.txt")); fi.remove(); if(!fi.open(QIODevice::Append)) { qDebug()<<"Cannot open file!"; return -1; } QTextStream ts(&fi); float num = 1, error = 2; ts<<"num="<<num<<"\t"<<"error="<<error<<endl; // 新增:刷新缓冲区并关闭文件 ts.flush(); fi.close();
方法2:利用对象生命周期自动处理
如果你的QFile对象是在局部作用域内创建的,当它离开作用域被销毁时,会自动触发文件关闭和缓冲区刷新。你可以把代码包在局部块里,让文件对象及时完成析构:
{ QFile fi(QString("result.txt")); fi.remove(); if(!fi.open(QIODevice::Append)) { qDebug()<<"Cannot open file!"; return -1; } QTextStream ts(&fi); float num = 1, error = 2; ts<<"num="<<num<<"\t"<<"error="<<error<<endl; } // 这里fi离开作用域,析构时自动完成关闭和刷新
额外补充个小优化:如果你的需求是每次写入都要覆盖旧内容,完全可以直接用QIODevice::WriteOnly | QIODevice::Truncate模式打开,这样就不用手动调用remove()了,代码会更简洁:
QFile fi(QString("result.txt")); if(!fi.open(QIODevice::WriteOnly | QIODevice::Truncate)) { qDebug()<<"Cannot open file!"; return -1; } QTextStream ts(&fi); float num = 1, error = 2; ts<<"num="<<num<<"\t"<<"error="<<error<<endl; // 同样可以调用flush/close,或者依赖对象析构自动处理
内容的提问来源于stack exchange,提问作者user957121
相关产品推荐
相关产品推荐

