QIODevice::read: устройство не открыто

Я наконец нашел файл пути, который QFile примет, используя QFile.exist() и здоровую дозу проб и ошибок.

Я хочу знать, почему работает следующее:

#include <QFile>
#include <QByteArray>
#include <QJsonObject>
#include <QJsonDocument>

QString path = QDir::currentPath();     // Get current dir
path.append("/noteLibrary.json");

QFile file(path);           // Give QFile current dir + path to file
if (!file.exists()) {       // Check to see if QFile found the file at given file_path
    qDebug() << "NO FILE HERE";
}
qDebug() << path;           // See what path was finally successful
file.open(QIODevice::ReadOnly);      // Continue parsing document to confirm everything else is functioning normally.
QByteArray rawData = file.readAll();

// Parse document
QJsonDocument doc(QJsonDocument::fromJson(rawData));

// Get JSON object
QJsonObject json = doc.object();

// Access properties
qDebug() << json["die"].toString();     // Should output "280C4"

Успешный вывод:

"/home/pi/noteLibrary.json"
"280C4"

Но следующее НЕ работает:

#include <QFile>
#include <QByteArray>
#include <QJsonObject>
#include <QJsonDocument>

QFile file("/home/pi/noteLibrary.json");           // Give QFile current dir + path to file
if (!file.exists()) {       // Check to see if QFile found the file at given file_path
    qDebug() << "NO FILE HERE";
}

//qDebug() << path;           // See what path was finally successful
file.open(QIODevice::ReadOnly);      // Continue parsing document to confirm everything else is functioning normally.
QByteArray rawData = file.readAll();

// Parse document
QJsonDocument doc(QJsonDocument::fromJson(rawData));

// Get JSON object
QJsonObject json = doc.object();

// Access properties
qDebug() << json["die"].toString();     // Should output "280C4"

Вывод ошибки:

NO FILE HERE
QIODevice::read (QFile, "/home/pi/Desktop/noteLibrary.json"): device not open
""

Почему QFile обрабатывает их по-другому? Это проблема формата QString? Или, возможно, виноват тот факт, что я развертываю это удаленно на Raspberry Pi 3?


person daGriggs    schedule 10.01.2017    source источник
comment
Второй фрагмент кода не может сделать этот вывод, потому что переменная path там не объявлена. Также реальный путь, который вы указываете для QFile, это /home/pi/Desktop/noteLibrary.json, а не /home/pi/noteLibrary.json. Проверьте это, пожалуйста.   -  person Evgeny    schedule 10.01.2017
comment
Ух ты. Должно быть, я скопировал/вставил неверный вывод из одной из последних 8 попыток, чтобы это сработало. Извините, что потратил на это ваше время.   -  person daGriggs    schedule 10.01.2017


Ответы (1)


Независимо от того, что было не так с моим кодом выше, приведенный ниже код, дающий QFile абсолютный путь, работает так же, как и создание QString с помощью currentPath(). Должно быть, у меня что-то еще не так, моя ошибка!

noteLibrary.json

{"note": [{
             "profile": "C4",
             "die": "280C4",
             "pressure": 800,
             "position": 10000
         },
         {
             "profile": "CC4",
             "die": "2280C4",
             "pressure": 8800,
             "position": 110000
         }

    ],
    "test": {
        "profile": "CCC4",
        "die": "22280C4",
        "pressure": 88800,
        "position": 1110000
    }
}

main.cpp отрывок

    QFile file("/home/pi/noteLibrary.json");
    if (!file.exists()) qDebug() << "NO FILE FOUND";
    file.open(QIODevice::ReadOnly);
    QByteArray rawData = file.readAll();
    QJsonDocument doc(QJsonDocument::fromJson(rawData));    // Parse document
    QJsonObject jObj = doc.object();    // Get JSON object
    qDebug() << jObj["test"];

Вывод приложения

QJsonValue(object,QJsonObject({"die":"22280C4","position":1110000,"pressure":88800,"profile":"CCC4"}))

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

person daGriggs    schedule 10.01.2017