void visualICDAR::open()
{QString fileName = QFileDialog::getOpenFileName( this, tr( "Open Image" ),
QDir::homePath(), tr("Images ( *.tif )") );
if( !fileName.isEmpty() )
{
QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
pixmapWidget->setPixmap( fileName );
QString dataFileName = fileName.replace( fileName.length() - 3, 3, "csv" );
QFile data( dataFileName );
if( !data.open(QIODevice::ReadOnly|QIODevice::Text) )
{
QMessageBox::warning( this, "NoCSV file founs!",
QString( "No %1 file was found!" ).arg( dataFileName ) );
}
QTextStream text( &data );
text.setCodec( "UTF-8" );
QString dataString = text.readAll();
( (QStandardItemModel*)fileWidget->model() )->clear();
fileWidget->AddRowsFromString( dataString );
fileWidget->setOutputFile( dataFileName );
data.close();
QApplication::restoreOverrideCursor();
}
}
class CFileWidget : public QTableView
{
Q_OBJECT
public:
CFileWidget(QWidget *parent);
~CFileWidget();
void setOutputFile( const QString fileName )
{ outputFile.setFileName(fileName);
outputFile.open(QIODevice::WriteOnly|QIODevice::Text); }
public slots:
void AddRowsFromString( const QString& text );
void DeleteSelectedRows();
void AddRow();
void SaveToFile();
signals:
void SelectRects( const QList<QRect>& rects, const QList<QRect>& parenRects );
protected slots:
void selectionChanged ( const QItemSelection & selected, const QItemSelection & deselected );
private:
int addonId;
QFile outputFile;
};
void CFileWidget::SaveToFile()
{
QTextStream textStream( &outputFile );
textStream.setCodec( "UTF-8" );
for( int row = 0; row < ( (QStandardItemModel*)model() )->rowCount(); ++row )
{
int column = 0;
while( ( (QStandardItemModel*)model() )->item( row, column ) )
{
textStream<<( (QStandardItemModel*)model() )->item( row, column )->data( Qt::DisplayRole ).toString();
textStream<<"\t";
column++;
}
textStream<<"\n";
}
}
我正在尝试从文件中读取一些数据但是当我读取它时,文件变空。 为什么会这样? 如果程序中出现一些错误,它将不会保存任何数据,我们将丢失它? 那么如何打开文件,从中读取并保留所有数据呢? 据我所知,如果我再次以只写模式打开它,我会重写所有不附加的数据吗?
关于代码 第一个功能是打开文件 第二段代码是存储QFile的类 第三个是保存到文件功能
答案 0 :(得分:0)
然后你打开它写作你应该决定(从应用程序逻辑的角度来看)你想做什么。如果要覆盖文件内容,则应使用WriteOnly模式,该模式与fopen()调用中的“w”模式完全相同,因此它会在打开时截断文件内容,因此文件打开后内容将立即丢失。
如果您打算保留内容并添加内容,请考虑使用附加模式,以便添加数据文件而不会丢失内容。
检查出来:http://harmattan-dev.nokia.com/docs/library/html/qt4/qiodevice.html#OpenModeFlag-enum
答案 1 :(得分:-2)
Qt只是一个带有自己的封装库的IDE,与普通文件操作不应该有太大的不同。你确定文件是空的还是看起来像空的?我并不完全记得它被称为什么,但数据首先被缓冲,并且需要被推送到文件中,在这两个过程之间它看起来是空的。如果在不打开“追加”的情况下打开文件,程序开始运行并退出,则文件将为空。一旦打开文件并附加on,指针就会指向结尾。