-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";
    }
}

ファイルからデータを読み取ろうとしていますが、読み取るとファイルが空になります。なぜそれが起こったのですか?プログラムに何らかのエラーが表示された場合、データは保存されず、失われますか? では、ファイルを開いて読み取り、すべてのデータを保持する方法は? 私が理解しているように、書き込み専用モードで再度開くと、追加ではなくすべてのデータが書き換えられますか?

コードについて最初の関数はファイルを開くためのもので、2番目のコードはQFileを格納するクラスで、3番目はファイル関数に保存するためのものです

4

2 に答える 2

0

沖、何が起こるかというと、あなたのプログラムはあなたが要求したとおりに動作するということです..次に、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 であり、通常のファイル操作とあまり変わらないはずです。ファイルが空であるか、空のように見えますか? それが何と呼ばれているのか正確には覚えていませんが、データは最初にバッファリングされ、ファイルにプッシュされる必要があります。これら 2 つのプロシージャの間では空のように見えます。「追加」をオンにせずにファイルを開き、プログラムが実行を開始して終了すると、ファイルは空になります。追加をオンにしてファイルを開くと、ポインターは最後を指します。

于 2013-04-23T15:42:51.427 に答える