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

4

2 回答 2

0

Oki,发生的事情是您的程序完全按照您的要求运行。然后您使用 QIODevice::ReadOnly 打开文件进行读取,您获得数据并且没有任何错误发生。

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

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

看看这个:http ://harmattan-dev.nokia.com/docs/library/html/qt4/qiodevice.html#OpenModeFlag-enum

于 2013-04-23T15:48:21.047 回答
-2

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

于 2013-04-23T15:42:51.427 回答