QTextStream在文件

时间:2016-02-25 15:51:08

标签: c++ qt-creator

我正在学习QtCreator并且在文件中写入数据时遇到了麻烦。这是一些代码:

char    *str;
int     i = 1;
QFile outFile("path/to/file/out.txt");
outFile.open(QIODevice::ReadWrite);
QTextStream out(&outFile);

while (i < rows * 2) {
    str = dynamic_cast<QLineEdit *>(this->getItem(i))->text().toLocal8Bit().data();
    std::cout << str << std::endl;
    out << str << "\n";
    i += 2;
}

getItem会从填充QWidget *的{​​{1}}中返回QFormLayout(这解释了动态广告)。无论如何,当我将QLineEdit传递给str它工作正常时,会打印数据,但是当我将std::cout传递给str时,它只会写入{{1}的第一个字符。 1}}在文件中 我不知道自己做错了什么,我真的很感激任何提示。

1 个答案:

答案 0 :(得分:1)

此行存在问题:str = dynamic_cast<QLineEdit *>(this->getItem(i))->text().toLocal8Bit().data();

dynamic_cast<QLineEdit *>(this->getItem(i))->可以 ->text()创建了一个临时的QString .toLocal8Bit()创建了一个临时的QByteArray .data()返回指向QByteArray

内部数据的指针

一旦传递线,QByteArray将被销毁,你有一个悬空指针。 str指向无效数据。

之后使用此指针执行的所有操作(除非让它指向其他位置)都是未定义的行为。

尝试使用以下内容:

int     i = 1;
QFile outFile("path/to/file/out.txt");
outFile.open(QIODevice::ReadWrite);
QTextStream out(&outFile);
while (i < rows * 2) 
{
    QLineEdit* lineEdit = dynamic_cast<QLineEdit *>(this->getItem(i));
    if (lineEdit)
    {
        QByteArray str = lineEdit->text().toLocal8Bit();
        std::cout << str.data() << std::endl;
        out << str.data() << "\n";
        i += 2;
    }
    else
    {
        std::cerr << "Item at " << i << " is no QLineEdit*" << std::endl;
    }
}
out.close();

另外,请检查QFile是否实际打开以及QTextStream在撰写时是否报告错误。