qt从文件中读取所有数据都被删除

时间:2013-04-23 15:12:04

标签: file qt

    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的类 第三个是保存到文件功能

2 个答案:

答案 0 :(得分:0)

Oki,会发生什么事情,你的程序完全按照你的要求运行..然后你打开文件阅读使用QIODevice :: ReadOnly,你得到数据并且没有任何错误发生。

然后你打开它写作你应该决定(从应用程序逻辑的角度来看)你想做什么。如果要覆盖文件内容,则应使用WriteOnly模式,该模式与fopen()调用中的“w”模式完全相同,因此它会在打开时截断文件内容,因此文件打开后内容将立即丢失。

如果您打算保留内容并添加内容,请考虑使用附加模式,以便添加数据文件而不会丢失内容。

检查出来:http://harmattan-dev.nokia.com/docs/library/html/qt4/qiodevice.html#OpenModeFlag-enum

答案 1 :(得分:-2)

Qt只是一个带有自己的封装库的IDE,与普通文件操作不应该有太大的不同。你确定文件是空的还是看起来像空的?我并不完全记得它被称为什么,但数据首先被缓冲,并且需要被推送到文件中,在这两个过程之间它看起来是空的。如果在不打开“追加”的情况下打开文件,程序开始运行并退出,则文件将为空。一旦打开文件并附加on,指针就会指向结尾。