Что означает "file.open(QIODevice::ReadOnly)"?

Я новичок в Qt, и я учился на странице " Начало работы". Я хочу знать, что означают следующие утверждения и зачем они нужны?

В открытой функции:

if (!file.open(QIODevice::ReadOnly)) {

    QMessageBox::critical(this, tr("Error"), tr("Could not open file"));

    return;
}

Также в функции Сохранить:

if (!file.open(QIODevice::WriteOnly)) {
            // error message
} 

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

1 ответ

Решение

Вы можете открывать файлы для чтения и для записи. С помощью QIODevice::WriteOnly или же QIODevice::ReadOnly флаги вы указываете режим, в котором вы будете открывать определенный файл.

Но почему это важно?

Предположим, у вас есть один файл, открытый в нескольких экземплярах разных программ, и что нет такой вещи, как указание режима файла. Теперь, если все файлы читают файл - поскольку все они имеют разные указатели на текущую позицию в файле - это не проблема - поскольку все программы будут получать самую последнюю и правильную информацию из файла. Но если только одна программа запишет что-то в файл - ваши данные будут непоследовательными, поэтому другие программы потенциально могут прочитать неверные данные.

Интуитивно понятным подходом было бы отправить сообщение всем программам, которые прикреплены к этому файлу, чтобы они могли сами обновляться. Но - что делать, если файл удален? Или если нет возможности установить правильную позицию в новых данных? Кроме того, каждая программа теперь должна иметь интерфейс, чтобы получать уведомления, и сама идея передачи сообщений может быть очень медленной (за исключением того, что она не работает).

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

В последнем абзаце описывается то, что называется техникой "несколько читателей - один писатель", поэтому вы можете поискать ее в Интернете или в учебниках по классам параллелизма.

Другие вопросы по тегам