C ++ дескриптор файла - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь реализовать класс дескриптора файла, подобный тому, который представлен на странице часто задаваемых вопросов Бьярна Страуструпа. (Перейдите к «Почему C ++ не предоставляет конструкцию« finally »» .) Однако, в отличие от его примера, я хочу использовать файловые потоки C ++ вместо FILE*.

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

class FileHandle {
public:
    FileHandle(const char* fn, ios_base::openmode mode = ios_base::in | ios_base::out) {
        file.open(fn, mode);
        // Check to make sure file is open
    }
    FileHandle(const string &fn, ios_base::openmode mode = ios_base::in | ios_base::out) {
        file.open(fn, mode);
        // Check to make sure file is open
    }
    ~FileHandle() {
        file.close();
    }
private:
    fstream file;
};

Я хотел бы знать, является ли это жизнеспособным способом создания дескриптора файла, то есть хороша ли моя идея наследования. Я также хочу знать, как лучше всего работать с параметром ios_base::openmode, потому что на справочной странице C ++ для std::ifstream сказано следующее:

Обратите внимание, что даже если поток является входным потоком, его внутренний объект filebuf может быть настроен также на поддержку операций вывода.

В каких случаях ifstream будет использоваться для операций вывода и, аналогично, когда of stream будет использоваться для операций ввода; и я должен ограничить параметры для параметра ios_base::openmode для моего класса дескрипторов файлов? Таким образом, мой дескриптор входного файла будет обрабатывать только операции ввода, а выходная версия будет обрабатывать только операции вывода.

1 Ответ

0 голосов
/ 08 июля 2019

В каких случаях ifstream будет использоваться для операций вывода и, аналогично, когда ofstream будет использоваться для операций ввода

Вы откроете выходной файлпоток с std::ios_base::in openmode и наоборот для потока входного файла, если вы все еще хотите выполнить те связанные операции, используя внутренний объект std::filebuf, который доступен stream->rdbuf().Обратите внимание, что потоки std::ofstream и std::ifstream по-прежнему смогут выполнять вывод и ввод соответственно, даже если они открываются с противоположными режимами открытия.

int main() {
    std::ofstream stream("test.txt");
    stream << "Hello" << std::flush;
    stream.close();
    stream.open("test.txt", std::ios_base::in);
    char buffer[SIZE] = {};
    stream.rdbuf()->sgetn(buffer, SIZE);
    std::cout << buffer << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...