из-за того и были, что вроде как стандартными средствами такое никак не сделать. Нагуглил этот костыль на стек оверфлоу, там ничего лучше не предложили. Неужели это такой редкий случай, что его за всё время существования std::iostreams так в стандарт и не завезли?
Это при том, что в POSIX есть open с O_CREAT|O_EXCL, через которую в итоге всё равно всё делается
из-за того и были, что вроде как стандартными средствами такое никак не сделать.
Ну... в MSVC, и, подозреваю, не только, потоки сделаны поверх FILE*, так что приключения бы только удлиннились.
У>Неужели это такой редкий случай, что его за всё время существования std::iostreams так в стандарт и не завезли?
iostreams говно, и далеко не только поэтому.
Использовать платформенные API или более вменяемые сторонние кросплатформенные обёртки (вроде QFile).
Русский военный корабль идёт ко дну!
Re[2]: А как плюсовыми средствами создать файл только если он не существует?
AG>Ну... в MSVC, и, подозреваю, не только, потоки сделаны поверх FILE*, так что приключения бы только удлиннились.
Думаешь? А почему не через POSIX APIшную open? Или вообще не через WinAPI?
Я думаю, что как не поверх FILE*, а у плюсовых потоков свои отдельные буфера, иначе зачем нужно было бы sync_with_stdio?
AG>iostreams говно, и далеко не только поэтому. AG>Использовать платформенные API или более вменяемые сторонние кросплатформенные обёртки (вроде QFile).
Да мне пофигу, что гавно. Я писал мелкую утилитку, и мне нах не впёрлось втаскивать туда что-то кроме стандартной библиотеки.
Re: А как плюсовыми средствами создать файл только если он н
Здравствуйте, удусекшл, Вы писали: У>А как плюсовыми средствами создать файл только если он не существует?
собственно это всё даже в гугле есть
если пустой файл считается как не существующий, то открой файл для добавления и проверь указатель на файл и его позицию в файле .. если ноль, значит файл новый или пустой
Скрытый текст
FILE* pFile = fopen(theFilePath, "a+");
if (pFile && gfetpos(pFile) == 0) {
// Either file didn't previously exist or it did and was empty
} else if (pFile) {
fclose(pFile);
}
Здравствуйте, xma, Вы писали:
У>>А как плюсовыми средствами создать файл только если он не существует?
xma>собственно это всё даже в гугле есть
xma>если пустой файл считается как не существующий, то открой файл для добавления и проверь указатель на файл и его позицию в файле .. если ноль, значит файл новый или пустой
Допустим, мне нельзя перетирать даже пустой файл, что тогда?
Ну и так-то, это тоже костыль
xma>ну либо проверяй файл на существование .. а потом если его нет создавай файл для записи (ну или для добавления "a+", без разницы)
В продакшн я бы такое не стал бы отдавать
Re[3]: А как плюсовыми средствами создать файл только если он не существует?
У>А почему не через POSIX APIшную open? Или вообще не через WinAPI?
Видимо, чтобы не переизобретать кэширование, без которого было бы совсем печально.
У>Да мне пофигу, что гавно. Я писал мелкую утилитку, и мне нах не впёрлось втаскивать туда что-то кроме стандартной библиотеки.
Ну окей, std::fopen — это стандартная библиотека.
Русский военный корабль идёт ко дну!
Re: А как плюсовыми средствами создать файл только если он не су
Здравствуйте, vsb, Вы писали:
vsb>Получить файловый дескриптор платформо-зависимыми средствами (open/_sopen_s) и преобразовать его в FILE* через fdopen
Ну вот это уже не C++.
И микрософт, как всегда, пошел своим путём, и там либо городить ifdef'ы, либо глотать варнинги и риски, что в будущем эту функцию вообще уберут
Re[3]: А как плюсовыми средствами создать файл только если о
Здравствуйте, удусекшл, Вы писали:
vsb>>Получить файловый дескриптор платформо-зависимыми средствами (open/_sopen_s) и преобразовать его в FILE* через fdopen
У>Ну вот это уже не C++.
Ну если не предусмотрели в стандартной библиотеке такой возможности, что поделаешь. По крайней мере платформо-зависимая часть будет составлять пару строк.
У>И микрософт, как всегда, пошел своим путём, и там либо городить ifdef'ы, либо глотать варнинги и риски, что в будущем эту функцию вообще уберут
vsb>Вроде у микрософта вообще нет обычного open, только _open, или я туплю?
Обычный open есть, но объявлен депрекейтед и генерит варнинги. А "_open" — не уверен, что он есть во всяких линупсах. И константы опций в линупсах тоже без '_', а у МС с ним. И тут вроде бы МС все правильно делает:
The name is deprecated because it doesn't follow the Standard C rules for implementation-specific names. However, the function is still supported.
и редиски в данном случае линупсоиды, но легче от этого не становится.
Хотя, может я отстал от жизни, и "_open" в линупсы тоже подвезли
Re[4]: А как плюсовыми средствами создать файл только если он не существует?
Здравствуйте, удусекшл, Вы писали:
У>Это при том, что в POSIX есть open с O_CREAT|O_EXCL, через которую в итоге всё равно всё делается
std::filesystem::exists?
Sic luceat lux!
Re[2]: А как плюсовыми средствами создать файл только если он не су
Здравствуйте, Kernan, Вы писали:
У>>Это при том, что в POSIX есть open с O_CREAT|O_EXCL, через которую в итоге всё равно всё делается K>std::filesystem::exists?
Там тогда надо ещё потанцевать и проверить, не является ли это каталогом. Это раз.
Во-вторых: окей, я проверил, файла не существует, можно создавать, но пока я в носу ковырял, кто-то другой его создал, и я молча перезапишу чужой файл
Re[5]: А как плюсовыми средствами создать файл только если он не существует?
Здравствуйте, удусекшл, Вы писали:
У>Обычный open есть, но объявлен депрекейтед и генерит варнинги.
Я думаю, что он не исчезнет, т.к. обеспечивает какую-никакую совместимость с юниксовым кодом.
У>и редиски в данном случае линупсоиды, но легче от этого не становится.
Подозреваю, что эти функции писали ещё до того, как придумали стандарт С и этот пункт.
У>Хотя, может я отстал от жизни, и "_open" в линупсы тоже подвезли
Вроде нет.
Re[3]: А как плюсовыми средствами создать файл только если о
Здравствуйте, удусекшл, Вы писали:
У>Во-вторых: окей, я проверил, файла не существует, можно создавать, но пока я в носу ковырял, кто-то другой его создал, и я молча перезапишу чужой файл
открывай тогда эксклюзивно файл — через виндовый CreateFile(..)
Здравствуйте, xma, Вы писали:
У>>Во-вторых: окей, я проверил, файла не существует, можно создавать, но пока я в носу ковырял, кто-то другой его создал, и я молча перезапишу чужой файл
xma>открывай тогда эксклюзивно файл — через виндовый CreateFile(..)
Заголовок темы перечитай, что ли.
Re[7]: А как плюсовыми средствами создать файл только если он не существует?