Прежде всего, я понятия не имею, почему вы думаете, что fopen("r+")
создает файл, если он не существует - в соответствии с ISO C & C ++ это не так, он просто открывает существующий файл для чтения / записи. Если вы хотите создать файл с fopen
, вы используете "w+"
.
Для потоков вы просто указываете trunc
:
std::ofstream file ("myfile.txt",
std::ios::in | std::ios::out | std::ios::trunc);
Однако и this, и fopen("w+")
будут обрезать файл. Нет стандартного способа открыть файл без усечения, если он существует, но создать его, если он не существует за один вызов. В лучшем случае вы можете попробовать открыть, проверить на наличие ошибок, а затем попытаться создать / усечь; но это может привести к состоянию гонки, если файл создан другим процессом после проверки, но перед усечением.
В POSIX вы можете использовать open
с O_CREAT
и без O_TRUNC
.