一. 文本文件读写

  • QFile
  • QTextStream | 枚举值 | 描述 | | —- | —- | | QIODevice::ReadOnly | 以只读方式打开 | | QIODevice::WriteOnly | 以只写方式打开 | | QIODevice::ReadWrite | 以读写方式打开 | | QIODevice::Append | 以追加方式加到文件末尾 | | QIODevice::Truncate | 以重写方式打开,原有内容会被删除 | | QIODevice::Text | 在读取时,将行结束符转换成\n;在写入时,将行结束符转成本地格式,如 Win32 是 \r\n |

1. QFile

直接操作,相当于每人一瓶水。

  • 读文件:
  1. #include <QFileDialog>
  2. QString curPath = QCoreApplication::applicationDirPath();
  3. QString title = "打开文件";
  4. QString filter = "文本文件(*.txt);;所有文件(*.*)";
  5. QString fileName = QFileDialog::getOpenFileName(this,
  6. title,
  7. curPath,
  8. filter);
  9. if (fileName.isEmpty()) return;
  10. QFile file(fileName);
  11. if (file.open(QIODevice::ReadOnly|QIODevice::Text)) {
  12. ui->plainTextEditIODevice->setPlainText(file.readAll());
  13. file.close();
  14. }
  • 写文件:
  1. QString curPath = QCoreApplication::applicationDirPath();
  2. QString title = "保存文件";
  3. QString filter = "文本文件(*.txt);;所有文件(*.*)";
  4. QString fileName = QFileDialog::getSaveFileName(this,
  5. title,
  6. curPath,
  7. filter);
  8. if (fileName.isEmpty()) return;
  9. QString str = ui->plainTextEditIODevice->toPlainText();
  10. QFile file(fileName);
  11. QByteArray strBytes = str.toUtf8();
  12. if (file.open(QIODevice::WriteOnly|QIODevice::Text)) {
  13. file.write(strBytes, strBytes.length());
  14. }

2. QTextStream

相当于装个饮水机,所有水都放入饮水机,然后一杯一杯弄,很好的控制

  • 读操作:
  1. QString curPath = QCoreApplication::applicationDirPath();
  2. QString title = "保存文件";
  3. QString filter = "文本文件(*.txt);;所有文件(*.*)";
  4. QString fileName = QFileDialog::getOpenFileName(this,
  5. title,
  6. curPath,
  7. filter);
  8. if (fileName.isEmpty()) return;
  9. QFile file(fileName);
  10. if (file.open(QIODevice::ReadOnly|QIODevice::Text)) {
  11. QTextStream stream(&file);
  12. // ui->plainTextEditTextStream->setPlainText(stream.readAll());
  13. while (!stream.atEnd()) {
  14. ui->plainTextEditTextStream->appendPlainText(stream.readLine());
  15. }
  16. file.close();
  17. }
  • 写操作:
  1. QString curPath = QCoreApplication::applicationDirPath();
  2. QString title = "保存文件";
  3. QString filter = "文本文件(*.txt);;所有文件(*.*)";
  4. QString fileName = QFileDialog::getSaveFileName(this,
  5. title,
  6. curPath,
  7. filter);
  8. if (fileName.isEmpty()) return;
  9. QString str = ui->plainTextEditTextStream->toPlainText();
  10. QFile file(fileName);
  11. if (file.open(QIODevice::WriteOnly|QIODevice::Text)) {
  12. QTextStream stream(&file);
  13. stream << str;
  14. }

二. 二进制文件读写

  • QFile: 负责文件的 IO 设备接口,即与文件的物理交互。
  • QDataStream: 以数据流的方式读取或写入文件内容

    • Qt 预定义编码
    • 标准编码

1. Qt 预定义编码

  • 写操作:
  1. QString curPath = QCoreApplication::applicationDirPath();
  2. QString fileName = QFileDialog::getSaveFileName(this,
  3. "保存文件",
  4. curPath,
  5. "Qt预定义编码(*.stm)");
  6. if (fileName.isEmpty()) return;
  7. QFile file(fileName);
  8. if (file.open(QIODevice::WriteOnly|QIODevice::Truncate)) {
  9. QDataStream stream(&file);
  10. stream.setVersion(QDataStream::Qt_5_9);
  11. qint16 rowCount = theModel->rowCount();
  12. qint16 colCount = theModel->columnCount();
  13. stream << rowCount;
  14. stream << colCount;
  15. for (int i=0; i<colCount; i++)
  16. stream << theModel->horizontalHeaderItem(i)->text();
  17. // 数据区域
  18. qint16 Depth;
  19. qreal MeasuredDepth, Direction, Offset;
  20. QString Quality;
  21. bool Sampled;
  22. for (int i=0; i<rowCount; i++) {
  23. Depth = theModel->item(i, 0)->data(Qt::DisplayRole).toInt();
  24. stream << Depth;
  25. MeasuredDepth = theModel->item(i, 1)->data(Qt::DisplayRole).toFloat();
  26. stream << MeasuredDepth;
  27. Direction = theModel->item(i, 2)->data(Qt::DisplayRole).toFloat();
  28. stream << Direction;
  29. Offset = theModel->item(i, 3)->data(Qt::DisplayRole).toFloat();
  30. stream << Offset;
  31. Quality = theModel->item(i, 4)->data(Qt::DisplayRole).toString();
  32. stream << Quality;
  33. Sampled = (theModel->item(i, 5)->checkState() == Qt::Checked);
  34. stream << Sampled;
  35. }
  36. file.close();
  37. }
  • 读操作:
  1. QString curPath = QCoreApplication::applicationDirPath();
  2. QString fileName = QFileDialog::getOpenFileName(this,
  3. "打开文件",
  4. curPath,
  5. "Qt预定义编码(*.stm)");
  6. if (fileName.isEmpty()) return;
  7. QFile file(fileName);
  8. if (file.open(QIODevice::ReadOnly)) {
  9. QDataStream stream(&file);
  10. stream.setVersion(QDataStream::Qt_5_9);
  11. qint16 rowCount, coloumnCount;
  12. stream >> rowCount;
  13. stream >> coloumnCount;
  14. resetTable(rowCount);
  15. QString str;
  16. for (int i=0; i<coloumnCount; i++)
  17. stream >> str;
  18. // 数据区域
  19. qint16 Depth;
  20. qreal MeasuredDepth, Direction, Offset;
  21. QString Quality;
  22. bool Sampled;
  23. QStandardItem *item;
  24. QModelIndex index;
  25. for (int i=0; i<rowCount; i++) {
  26. stream >> Depth;
  27. index = theModel->index(i, 0);
  28. item = theModel->itemFromIndex(index);
  29. item->setData(Depth, Qt::DisplayRole);
  30. stream >> MeasuredDepth;
  31. index = theModel->index(i, 1);
  32. item = theModel->itemFromIndex(index);
  33. item->setData(MeasuredDepth, Qt::DisplayRole);
  34. stream >> Direction;
  35. index = theModel->index(i, 2);
  36. item = theModel->itemFromIndex(index);
  37. item->setData(Direction, Qt::DisplayRole);
  38. stream >> Offset;
  39. index = theModel->index(i, 3);
  40. item = theModel->itemFromIndex(index);
  41. item->setData(Offset, Qt::DisplayRole);
  42. stream >> Quality;
  43. index = theModel->index(i, 4);
  44. item = theModel->itemFromIndex(index);
  45. item->setData(Quality, Qt::DisplayRole);
  46. stream >> Sampled;
  47. index = theModel->index(i, 5);
  48. item = theModel->itemFromIndex(index);
  49. if (Sampled)
  50. item->setCheckState(Qt::Checked);
  51. else
  52. item->setCheckState(Qt::Unchecked);
  53. }
  54. file.close();
  55. }

2. 标准编码

  • 写操作:
  1. QString curPath = QCoreApplication::applicationDirPath();
  2. QString fileName = QFileDialog::getSaveFileName(this,
  3. "保存文件",
  4. curPath,
  5. "标准编码(*.dat)");
  6. if (fileName.isEmpty()) return;
  7. QFile file(fileName);
  8. if (file.open(QIODevice::WriteOnly|QIODevice::Truncate)) {
  9. QDataStream stream(&file);
  10. stream.setByteOrder(QDataStream::LittleEndian);
  11. qint16 rowCount = theModel->rowCount();
  12. qint16 colCount = theModel->columnCount();
  13. stream.writeRawData((char *)&rowCount, sizeof(qint16));
  14. stream.writeRawData((char *)&colCount, sizeof(qint16));
  15. QByteArray btArray;
  16. for (int i=0; i<colCount; i++) {
  17. QString str = theModel->horizontalHeaderItem(i)->text();
  18. btArray = str.toUtf8();
  19. stream.writeBytes(btArray, btArray.length());
  20. }
  21. // 数据区域
  22. qint16 Depth;
  23. qreal MeasuredDepth, Direction, Offset;
  24. QString Quality;
  25. bool Sampled;
  26. for (int i=0; i<rowCount; i++) {
  27. qDebug("row: %d", i);
  28. Depth = theModel->item(i, 0)->data(Qt::DisplayRole).toInt();
  29. qDebug("Depth: %d", Depth);
  30. stream.writeRawData((char *)&Depth, sizeof(qint16));
  31. MeasuredDepth = theModel->item(i, 1)->data(Qt::DisplayRole).toFloat();
  32. stream.writeRawData((char *)&MeasuredDepth, sizeof(qreal));
  33. Direction = theModel->item(i, 2)->data(Qt::DisplayRole).toFloat();
  34. stream.writeRawData((char *)&Direction, sizeof(qreal));
  35. Offset = theModel->item(i, 3)->data(Qt::DisplayRole).toFloat();
  36. stream.writeRawData((char *)&Offset, sizeof(qreal));
  37. Quality = theModel->item(i, 4)->data(Qt::DisplayRole).toString();
  38. stream.writeBytes(Quality.toUtf8(), Quality.length());
  39. Sampled = (theModel->item(i, 5)->checkState() == Qt::Checked);
  40. qint8 yes = 0;
  41. if (Sampled)
  42. yes = 1;
  43. stream.writeRawData((char *)&yes, sizeof(qint8));
  44. }
  45. file.close();
  46. }
  • 读操作:
  1. QString curPath = QCoreApplication::applicationDirPath();
  2. QString fileName = QFileDialog::getOpenFileName(this,
  3. "打开文件",
  4. curPath,
  5. "标准编码(*.dat)");
  6. if (fileName.isEmpty()) return;
  7. QFile file(fileName);
  8. if (file.open(QIODevice::ReadOnly)) {
  9. QDataStream stream(&file);
  10. stream.setByteOrder(QDataStream::LittleEndian);
  11. qint16 rowCount, colCount;
  12. stream.readRawData((char *)&rowCount, sizeof(qint16));
  13. stream.readRawData((char *)&colCount, sizeof(qint16));
  14. resetTable(rowCount);
  15. char *buf;
  16. uint strlen;
  17. for (int i=0; i<colCount; i++)
  18. stream.readBytes(buf, strlen);
  19. // 数据区域
  20. qint16 Depth;
  21. qreal MeasuredDepth, Direction, Offset;
  22. QString Quality;
  23. qint8 Sampled;
  24. QStandardItem *item;
  25. QModelIndex index;
  26. for (int i=0; i<rowCount; i++) {
  27. stream.readRawData((char *)&Depth, sizeof(qint16));
  28. index = theModel->index(i, 0);
  29. item = theModel->itemFromIndex(index);
  30. item->setData(Depth, Qt::DisplayRole);
  31. stream.readRawData((char *)&MeasuredDepth, sizeof(qreal));
  32. index = theModel->index(i, 1);
  33. item = theModel->itemFromIndex(index);
  34. item->setData(MeasuredDepth, Qt::DisplayRole);
  35. stream.readRawData((char *)&Direction, sizeof(qreal));
  36. index = theModel->index(i, 2);
  37. item = theModel->itemFromIndex(index);
  38. item->setData(Direction, Qt::DisplayRole);
  39. stream.readRawData((char *)&Offset, sizeof(qreal));
  40. index = theModel->index(i, 3);
  41. item = theModel->itemFromIndex(index);
  42. item->setData(Offset, Qt::DisplayRole);
  43. stream.readBytes(buf, strlen);
  44. Quality = QString::fromLocal8Bit(buf, strlen);
  45. index = theModel->index(i, 4);
  46. item = theModel->itemFromIndex(index);
  47. item->setData(Quality, Qt::DisplayRole);
  48. stream.readRawData((char *)&Sampled, sizeof(qint8));
  49. index = theModel->index(i, 5);
  50. item = theModel->itemFromIndex(index);
  51. if (Sampled == 1)
  52. item->setCheckState(Qt::Checked);
  53. else
  54. item->setCheckState(Qt::Unchecked);
  55. }
  56. file.close();
  57. }