2013-04-23 43 views
-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"; 
    } 
} 

我想从文件中读取一些数据,但是当我读它的文件变空。 这是为什么发生? 如果程序中出现一些错误,它不会保存任何数据,我们会失去它? 那么如何打开文件,从中读取并保存所有数据呢? 据我了解,如果我用只写模式再次打开它,我会重写所有数据不会追加?QT从文件读取时的所有数据被删除

有关代码 第一个功能是打开的文件 第二一段代码是类存储QFile时 ,三是保存到文件功能

+0

代码应导致文件内容会丢失。可能你是用Write选项打开同一个文件的吗?添加使用QIODevice :: Append – evilruff 2013-04-23 15:26:35

+0

我从文件中读取后关闭它,但后来在代码中保留文件名 ,我使用只写和文本模式将数据写回。 它只是奇怪,如果我只是打开了它,代码没有达成保存到文件的功能,比我尽量减少我的程序,去探险,看看我刚打开该文件系为0的大小(但70 KB) – 2013-04-23 15:41:35

+0

它是在读取前或后读取文件清空?如果你退出应用程序,数据完全消失了吗? – 2013-04-23 15:57:20

回答

-2

Qt的只是一个有自己的封装库IDE,不应该与正常的文件操作不同。你确定该文件是空的或它看起来像空吗?我不记得它叫什么,但数据首先被缓冲,并且需要被推入一个文件中,在这两个过程之间看起来像是空的。如果您打开一个文件时未打开“追加”,并且程序开始运行并退出,则文件将为空。一旦你打开附加文件,指针将指向结尾。

+3

QT是SDK,框架,但肯定不是一个IDE .. – evilruff 2013-04-23 15:44:55

+0

对我来说,是VS IDE也有自己的封装库。不知道为什么有些人痴迷于名字。 – Tiina 2013-04-23 15:49:37

+1

因为如果你想被当作专业的开发者,我相信你应该至少使用正确的术语回答问题.. VS确实是一个IDE,虽然我没有看到神秘的“封装图书馆的关系.. – evilruff 2013-04-23 15:50:44

0

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

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

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

检查了这一点:你贴不看真的有害,肯定http://harmattan-dev.nokia.com/docs/library/html/qt4/qiodevice.html#OpenModeFlag-enum

+0

文件读写 之间空我失去了一切 – 2013-04-23 16:08:58

+0

如果在读取之后文件被正确关闭并且在写入文件的内容之前发生错误不会丢失。如果你打开一个文件进行写入和错误发生之前,你实际上称为写,然后你失去一个内容.. – evilruff 2013-04-23 16:12:10

+0

错误发生时,我操纵数据在程序中,并不按保存到文件按钮 主要问题,为什么如果我读从文件,然后在资源管理器中检查文件的大小为零 我在C中使用了基本输入\输出函数并从未遇到过这个问题 – 2013-04-23 16:18:00

相关问题