Создание / запись в новый файл в Qt - PullRequest
44 голосов
/ 07 февраля 2011

Я пытаюсь записать в файл и, если файл не существует, создайте его.Я искал в интернете, и у меня ничего не получалось.

Мой код выглядит сейчас так:

QString filename="Data.txt";
QFile file( filename );
if ( file.open(QIODevice::ReadWrite) )
{
    QTextStream stream( &file );
    stream << "something" << endl;
}

Если я создаю в каталоге текстовый файл с именем Данные, он остается пустым.Если я ничего не создаю, он тоже не создает файл.Я не знаю, что с этим делать, это не первый способ, которым я пытался создать / записать в файл, и ни один из способов не сработал.

Спасибо за ваши ответы.

Ответы [ 6 ]

22 голосов
/ 07 февраля 2011

Это странно, все выглядит хорошо, вы уверены, что это не работает для вас?Потому что это main, безусловно, работает для меня, поэтому я бы искал источник вашей проблемы в другом месте.

#include <QFile>
#include <QTextStream>


int main()
{
    QString filename = "Data.txt";
    QFile file(filename);
    if (file.open(QIODevice::ReadWrite)) {
        QTextStream stream(&file);
        stream << "something" << endl;
    }
}

Код, который вы указали, также почти совпадает с кодом, предоставленным в подробноописание QTextStream , поэтому я вполне уверен, что проблема в другом месте:)

Также обратите внимание, что файл не называется Data, а Data.txt и должен быть создан / расположен в каталогеиз которого была запущена программа (не обязательно та, где находится исполняемый файл).

22 голосов
/ 07 февраля 2011

Вы уверены, что находитесь в правильном каталоге?
Открытие файла без полного пути откроет его в текущем рабочем каталоге. В большинстве случаев это не то, что вы хотите. Попробуйте изменить первую строку на

QString filename="c:\\Data.txt" или
QString filename="c:/Data.txt"

и посмотрите, создан ли файл в c:\

8 голосов
/ 02 августа 2014
#include <QFile>
#include <QCoreApplication>
#include <QTextStream>

int main(int argc, char *argv[])
{
    // Create a new file     
    QFile file("out.txt");
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    QTextStream out(&file);
    out << "This file is generated by Qt\n";

    // optional, as QFile destructor will already do it:
    file.close(); 

    //this would normally start the event loop, but is not needed for this
    //minimal example:
    //return app.exec();

    return 0;
}
3 голосов
/ 20 октября 2015

Ваш код в порядке, вы просто не ищите нужное место, чтобы найти свой файл. Поскольку вы не указали абсолютный путь, ваш файл будет создан относительно текущей рабочей папки (точнее, в текущей рабочей папке в вашем случае).

Ваша текущая рабочая папка установлена ​​Qt Creator. Перейдите в Проекты >> Выбранная сборка >> Нажмите кнопку «Выполнить» (рядом с «Построить»), и вы увидите, что на этой странице есть, что, конечно, вы также можете изменить.

enter image description here

1 голос
/ 25 января 2018

Может случиться, что причина не в том, что вы не нашли правильный каталог. Например, вы можете читать из файла (даже без абсолютного пути), но кажется, что вы не можете записать в него.

В этом случае может случиться так, что вы запрограммируете выходы до того, как запись будет завершена.

Если ваша программа использует цикл обработки событий (например, в приложении с графическим интерфейсом, например, QMainWindow), это не проблема. Однако, если ваша программа завершает работу сразу после записи в файл, вы должны очистить поток текста, закрывая файл не всегда достаточно (и это не нужно, так как он закрыт в деструкторе).

stream << "something" << endl;
stream.flush();

Это гарантирует, что изменения будут зафиксированы в файле до того, как программа продолжит выполнение этой инструкции.

Кажется, проблема в том, что QFile уничтожается перед QTextStream. Таким образом, даже если поток очищается в деструкторе QTextStream, уже слишком поздно, поскольку файл уже закрыт.

0 голосов
/ 14 июня 2016
QFile file("test.txt");
/*
 * If file not exit it will create
 * */
if (!file.open(QIODevice::ReadOnly | QIODevice::Text | QIODevice::ReadWrite))
{
    qDebug() << "FAIL TO CREATE FILE / FILE NOT EXIT***";
}

/*for Reading line by line from text file*/
while (!file.atEnd()) {
    QByteArray line = file.readLine();
    qDebug() << "read output - " << line;
}

/*for writing line by line to text file */
if (file.open(QIODevice::ReadWrite))
{
    QTextStream stream(&file);
    stream << "1_XYZ"<<endl;
    stream << "2_XYZ"<<endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...