从 QTableWidget 序列化时 CSV 文件中不需要的字符
Unwanted character in CSV file when serializing from QTableWidget
我正在尝试从 QTableWidget
中读取数据,并将它们保存在 CSV 文件中。
保存在文件中的值是正确的,但对于每一行的第一列,开头都有一个不需要的字符。
这是我的代码:
void Task::on_button_Export_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this,tr("Export Task List"), "",tr("CSV Files (*.csv)"));
if (fileName.isEmpty())
return;
else
{
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly))
{
QMessageBox::information(this, tr("Unable to open file"),
file.errorString());
return;
}
QDataStream out(&file);
out.setVersion(QDataStream::Qt_5_4);
int rowCount = ui->tableWidget->rowCount();
int colCount = ui->tableWidget->columnCount();
for (int i = 0; i < rowCount; i++)
{
QString str(QString::null);
/* if (i > 0)
{
str = "\n";
}*/
for (int j = 0; j < colCount; j++)
{
if (j > 0)
{
str += ",";
}
QTableWidgetItem* item = ui->tableWidget->item(i,j);
str += item->data(Qt::DisplayRole).toString();
}
str += "\n";
out << str;
}
}
}
保存的文件如下所示:
ÎDPC Task
ÞMain Task
ÌWorkLoop
ÐWorkLoop
ÌIST0
ÊIST1
ÆIST2
我正在使用 Qt 5.4.0。
如有任何帮助,我们将不胜感激。
如果你用return
结束函数的执行,你一开始的else
就没用了(你在第二次测试中没有使用else
)。
如果你需要写文本,你应该使用 QTextStream
而不是 QDataStream
,它被设计为 read/write 二进制数据。
为什么要在循环中使用临时 QString
?你有一个流,使用它:
void Task::on_button_Export_clicked() {
QString fileName = QFileDialog::getSaveFileName(
this,tr("Export Task List"), "",tr("CSV Files (*.csv)")
);
if (fileName.isEmpty()) {
return;
}
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::information(this, tr("Unable to open file"),
file.errorString());
return;
}
QTextStream out(&file);
int rowCount = ui->tableWidget->rowCount();
int colCount = ui->tableWidget->columnCount();
for (int i = 0; i < rowCount; i++) {
/* if (i > 0) {
out << "\n";
}*/
for (int j = 0; j < colCount; j++) {
if (j > 0) {
out << ",";
}
QTableWidgetItem* item = ui->tableWidget->item(i,j);
out << item->data(Qt::DisplayRole).toString();
}
out << "\n";
}
}
不要使用 QDataStream
来保存文本文件。使用 QTextStream
。 QDataStream
使用它自己的序列化格式而不是编写纯文本。
对于字符串,前两个字节是长度,然后是内容(每个字符 2 个字节)。您的 "garbage" 是每个字符串的长度。你只看到一个字符,因为你的文件是 unicode。
我正在尝试从 QTableWidget
中读取数据,并将它们保存在 CSV 文件中。
保存在文件中的值是正确的,但对于每一行的第一列,开头都有一个不需要的字符。
这是我的代码:
void Task::on_button_Export_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this,tr("Export Task List"), "",tr("CSV Files (*.csv)"));
if (fileName.isEmpty())
return;
else
{
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly))
{
QMessageBox::information(this, tr("Unable to open file"),
file.errorString());
return;
}
QDataStream out(&file);
out.setVersion(QDataStream::Qt_5_4);
int rowCount = ui->tableWidget->rowCount();
int colCount = ui->tableWidget->columnCount();
for (int i = 0; i < rowCount; i++)
{
QString str(QString::null);
/* if (i > 0)
{
str = "\n";
}*/
for (int j = 0; j < colCount; j++)
{
if (j > 0)
{
str += ",";
}
QTableWidgetItem* item = ui->tableWidget->item(i,j);
str += item->data(Qt::DisplayRole).toString();
}
str += "\n";
out << str;
}
}
}
保存的文件如下所示:
ÎDPC Task
ÞMain Task
ÌWorkLoop
ÐWorkLoop
ÌIST0
ÊIST1
ÆIST2
我正在使用 Qt 5.4.0。
如有任何帮助,我们将不胜感激。
如果你用return
结束函数的执行,你一开始的else
就没用了(你在第二次测试中没有使用else
)。
如果你需要写文本,你应该使用 QTextStream
而不是 QDataStream
,它被设计为 read/write 二进制数据。
为什么要在循环中使用临时 QString
?你有一个流,使用它:
void Task::on_button_Export_clicked() {
QString fileName = QFileDialog::getSaveFileName(
this,tr("Export Task List"), "",tr("CSV Files (*.csv)")
);
if (fileName.isEmpty()) {
return;
}
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::information(this, tr("Unable to open file"),
file.errorString());
return;
}
QTextStream out(&file);
int rowCount = ui->tableWidget->rowCount();
int colCount = ui->tableWidget->columnCount();
for (int i = 0; i < rowCount; i++) {
/* if (i > 0) {
out << "\n";
}*/
for (int j = 0; j < colCount; j++) {
if (j > 0) {
out << ",";
}
QTableWidgetItem* item = ui->tableWidget->item(i,j);
out << item->data(Qt::DisplayRole).toString();
}
out << "\n";
}
}
不要使用 QDataStream
来保存文本文件。使用 QTextStream
。 QDataStream
使用它自己的序列化格式而不是编写纯文本。
对于字符串,前两个字节是长度,然后是内容(每个字符 2 个字节)。您的 "garbage" 是每个字符串的长度。你只看到一个字符,因为你的文件是 unicode。