поведение c ++ std :: fstream на MacOS - PullRequest
0 голосов
/ 14 июля 2009

В MacOS с gcc4.2 должен ли следующий код создать новый файл, если его нет?

#include <fstream>

void test () {
    std::fstream file ("myfile.txt", std::ios::in | std::ios::out);
}

По моей логике следует либо открыть существующий файл для чтения / записи, либо создать новый пустой файл для чтения / записи. Но поведение, которое я получаю, заключается в том, что он не будет создавать новый файл, если «myfile.txt» не существует.

Как мне получить то же поведение, что и fopen ("myfile.txt", "r +");

Кроме того,

#include <fstream>

void test () {
    std::ofstream file ("myfile.txt", std::ios::in | std::ios::out);
}

Будет всегда обрезать существующий файл ...

Это стандартное поведение?

Ответы [ 2 ]

4 голосов
/ 14 июля 2009

Прежде всего, я понятия не имею, почему вы думаете, что 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.

0 голосов
/ 14 июля 2009

Для первого случая вы указали, что ОБА читаете и записываете в файл. Следовательно, он потерпит неудачу, если файл еще не существует. Вы можете попытаться использовать два отдельных потока (один для чтения, а другой для записи) и сначала создать выходной поток. Что касается второго случая, вы можете использовать «std :: ios :: app» (открыть в режиме добавления), чтобы предотвратить усечение. [Протестировано с Mac OS X 10.4.11, GCC 4.0.1]

...