У>Обычный 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.
А почему CreateFileW не нарушает Standard C rules? Он не начинается с прочерка.
Re[5]: А как плюсовыми средствами создать файл только если он не су
Здравствуйте, удусекшл, Вы писали:
У>Обычный 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.
Не могу найти такого требования в стандарте C.
У>и редиски в данном случае линупсоиды, но легче от этого не становится. У>Хотя, может я отстал от жизни, и "_open" в линупсы тоже подвезли
И не начинали.
The God is real, unless declared integer.
Re[6]: А как плюсовыми средствами создать файл только если он не су
У>>Обычный 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 есть, но объявлен депрекейтед и генерит варнинги. А "_open" — не уверен, что он есть во всяких линупсах. И константы опций в линупсах тоже без '_', а у МС с ним. И тут вроде бы МС все правильно делает: У>>>
The name is deprecated because it doesn't follow the Standard C rules for implementation-specific names. However, the function is still supported.
Не будет ли так любезен дорогой коллега объяснить конкретнее, какой подпункт данного пункта в какой конкретно формулировке подразумевает такое требование?
The God is real, unless declared integer.
Re[8]: А как плюсовыми средствами создать файл только если он не су
У>>>>Обычный 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.
N>>>Не могу найти такого требования в стандарте C.
σ>>http://port70.net/~nsz/c/c11/n1570.html#7.1.3
N>Не будет ли так любезен дорогой коллега объяснить конкретнее, какой подпункт данного пункта в какой конкретно формулировке подразумевает такое требование?
Я предполагаю что шизы из Microsoft решили, что зарезервированы (не могут объявляться/определяться программой) идентификаторы как описано в том разделе.
open не зарезервирован и может определяться программой. Если будет конфликт с open, который пришёл извне программы, например, из fcntl.h, то тут виноват fcntl.h.
Re[9]: А как плюсовыми средствами создать файл только если он не су
Здравствуйте, σ, Вы писали:
σ>>>http://port70.net/~nsz/c/c11/n1570.html#7.1.3
σ>Я предполагаю что шизы из Microsoft решили, что зарезервированы (не могут объявляться/определяться программой) идентификаторы как описано в том разделе. σ>open не зарезервирован и может определяться программой. Если будет конфликт с open, который пришёл извне программы, например, из fcntl.h, то тут виноват fcntl.h.
Идея понятна, но тогда почему open должен был подпадать под это требование, а CreateFile — нет? Кто мешает определить такое имя в юзерском коде?
Даже если предположить, что они пользовались такой логикой, то что-то не сходится.
У меня тут другое предположение: периодически у них формулировалась необходимость реализовать и дать программам POSIX-подсистему. В Posix явно определён свой open(). Сделать POSIX поверх WinAPI они не могли, глубинная семантика очень разная. В таком случае им нужно различать тот open(), который полноценный POSIX, и тот open(), который эмуляция в CRT в пределах того, что они хотят в него вложить. Логично тогда второй назвать _open() (минимум замены), или crt_open, или ещё как-то.
И вот тогда это требование не создавать конфликта обретает плоть...
The God is real, unless declared integer.
Re[3]: А как плюсовыми средствами создать файл только если о
Здравствуйте, удусекшл, Вы писали:
У>Здравствуйте, Kernan, Вы писали:
У>>>Это при том, что в POSIX есть open с O_CREAT|O_EXCL, через которую в итоге всё равно всё делается K>>std::filesystem::exists?
У>Там тогда надо ещё потанцевать и проверить, не является ли это каталогом. Это раз.
_stat. В Linux и прочих UNIX-подобных системах — stat. Если файл уже открыт, можно функцию _fstat использовать, у которой параметр — файловый дескриптор, а не путь.
Здравствуйте, AleksandrN, Вы писали:
У>>Там тогда надо ещё потанцевать и проверить, не является ли это каталогом. Это раз.
AN>_stat. В Linux и прочих UNIX-подобных системах — stat.
Пофиг, потому что всё равно есть шанс на обгон...
The God is real, unless declared integer.
Re[8]: А как плюсовыми средствами создать файл только если он не существует?
Здравствуйте, xma, Вы писали:
У>>И что? Твой код делает не то, что нужно, этого достаточно
xma>он делает то что ты и просил — в заголовке темы .. а что тебе реально было надо — тут телепатов нету ..
Он делает не то, что я просил.
Re[6]: А как плюсовыми средствами создать файл только если о
Здравствуйте, xma, Вы писали:
У>>Заголовок темы перечитай, что ли.
xma>а ты не огрызайся, а почекай лучше что тебе предлагают .. (всё в точности с твоими требованиями в заголовке темы)
xma>CreateFileA function (fileapi.h)
Спасибо, я винапи знаю. Перечитай таки заголовок
Re[4]: А как плюсовыми средствами создать файл только если о
Здравствуйте, AleksandrN, Вы писали:
У>>Там тогда надо ещё потанцевать и проверить, не является ли это каталогом. Это раз.
AN>_stat. В Linux и прочих UNIX-подобных системах — stat. Если файл уже открыт, можно функцию _fstat использовать, у которой параметр — файловый дескриптор, а не путь.
Ну, так я и говорю — танцевать надо. А _fstat, кстати, получает целочисленный дескриптор, и не не уверен, что из FILE* его можно вытащить
Re[10]: А как плюсовыми средствами создать файл только если он не су
Здравствуйте, netch80, Вы писали:
N>Сделать POSIX поверх WinAPI они не могли, глубинная семантика очень разная.
Разве? А как же Windows Subsystem for Linux?
И каждый день — без права на ошибку...
Re[5]: А как плюсовыми средствами создать файл только если о
Здравствуйте, удусекшл, Вы писали:
У>Ну, так я и говорю — танцевать надо. А _fstat, кстати, получает целочисленный дескриптор, и не не уверен, что из FILE* его можно вытащить
int fileno(FILE *stream)
Re[11]: А как плюсовыми средствами создать файл только если он не су
Здравствуйте, B0FEE664, Вы писали:
N>>Сделать POSIX поверх WinAPI они не могли, глубинная семантика очень разная. BFE>Разве? А как же Windows Subsystem for Linux?
Здравствуйте, vsb, Вы писали:
vsb>Здравствуйте, B0FEE664, Вы писали:
N>>>Сделать POSIX поверх WinAPI они не могли, глубинная семантика очень разная. BFE>>Разве? А как же Windows Subsystem for Linux?
σ>>>>http://port70.net/~nsz/c/c11/n1570.html#7.1.3
σ>>Я предполагаю что шизы из Microsoft решили, что зарезервированы (не могут объявляться/определяться программой) идентификаторы как описано в том разделе. σ>>open не зарезервирован и может определяться программой. Если будет конфликт с open, который пришёл извне программы, например, из fcntl.h, то тут виноват fcntl.h.
N>Идея понятна, но тогда почему open должен был подпадать под это требование, а CreateFile — нет? Кто мешает определить такое имя в юзерском коде?
CreateFile __stdcall, а юзерский код по-умолчанию __cdecl. Хотя да, это не спасёт от конфликтов в сырцах, только при линковке.
N>Даже если предположить, что они пользовались такой логикой, то что-то не сходится.
N>У меня тут другое предположение: периодически у них формулировалась необходимость реализовать и дать программам POSIX-подсистему. В Posix явно определён свой open(). Сделать POSIX поверх WinAPI они не могли, глубинная семантика очень разная. В таком случае им нужно различать тот open(), который полноценный POSIX, и тот open(), который эмуляция в CRT в пределах того, что они хотят в него вложить. Логично тогда второй назвать _open() (минимум замены), или crt_open, или ещё как-то. N>И вот тогда это требование не создавать конфликта обретает плоть...
Если сам всё знаешь, зачем меня просишь объяснить тогда?
Re[11]: А как плюсовыми средствами создать файл только если он не су
из-за того и были, что вроде как стандартными средствами такое никак не сделать. Нагуглил этот костыль на стек оверфлоу, там ничего лучше не предложили. Неужели это такой редкий случай, что его за всё время существования std::iostreams так в стандарт и не завезли?
У>Это при том, что в POSIX есть open с O_CREAT|O_EXCL, через которую в итоге всё равно всё делается
Создать файл с гарантированно уникальным именем (uuid какой-нибудь), затем std::filesystem::rename, а при неудаче удалить?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.