Подтвердить что ты не робот

С++ можно ли повторно использовать fstream для открытия и записи нескольких файлов?

У меня есть 10 файлов, которые нужно открыть для записи в последовательности. Могу ли я использовать один поток для этого? Мне нужно сделать что-нибудь специальное (кроме flush()) между каждым файлом или просто вызвать open(file1, fstream::out | std::ofstream::app) для каждого файла и закрыть поток в конце всех 10 файлов.

4b9b3361

Ответ 1

Сначала вам нужно закрыть его, потому что вызов open в уже открытом потоке завершается с ошибкой. (Это означает, что флаг failbit установлен в значение true). Заметьте close() flushes, поэтому вам не нужно беспокоиться об этом:

std::ofstream file("1");
// ...
file.close();
file.clear(); // clear flags
file.open("2");
// ...

// and so on

Также обратите внимание: вам не нужно close() его в последний раз; деструктор делает это для вас (а значит, и flush()). Это может сделать приятную функцию полезности:

template <typename Stream>
void reopen(Stream& pStream, const char * pFile,
            std::ios_base::openmode pMode = ios_base::out)
{
    pStream.close();
    pStream.clear();
    pStream.open(pFile, pMode);
}

И вы получите:

std::ofstream file("1");
// ...
reopen(file, "2")
// ...

// and so on

Ответ 2

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

Тем не менее, лучше использовать новый объект scoped fstream для каждого доступа к файлам, чтобы воспользоваться конструктором и поведениями деструктора:

struct {
    const char *filename;
    void (*operation)(fstream&);
} filelist[] = {
    { "file1", callback1 },
    { "file2", callback2 },
    ...
    { "file10", callback10 },
};

for (int i = 0; i < 10; ++i) {
    fstream f(filelist[i].filename);
    filelist[i].operation(f);
}

В приведенном выше примере кода fstream каждый раз сбрасывается и закрывается через цикл for, потому что деструктор вызывается, когда объект теряет область действия. Fstream передается ссылкой на функцию обратного вызова, чтобы операции можно обрабатывать на основе каждого файла без неприятного оператора switch. Если операция одинакова для каждого файла, тогда эта конструкция может быть устранена.

Ответ 3

Закрытие потока подразумевает flush(), поэтому пока вы close() каждый поток перед тем, как открыть следующий, вы должны быть в порядке.