2009-07-14 4 views
0

В MacOS с gcc4.2 должен ли следующий код создать новый файл, если он не существует?C++ std :: fstream поведение на MacOS

#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); 
} 

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

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

ответ

4

Прежде всего, я понятия не имею, почему вы думаете, что fopen("r+") создает файл, если он не существует - согласно ISO C & C++, это не так, он просто открывает существующий файл для чтения/записи. Если вы хотите создать файл с fopen, вы используете "w+".

Для потоков, вы просто указываете trunc:

std::ofstream file ("myfile.txt", 
    std::ios::in | std::ios::out | std::ios::trunc); 

Однако, как это и fopen("w+") будет усечь файл. Нет стандартного способа открыть файл без усечения, если он существует, но создать его, если он не существует в одном вызове. В лучшем случае вы можете попытаться открыть, проверить наличие сбоя, а затем попытаться создать/усечь; но это может привести к состоянию гонки, если файл создается другим процессом после проверки, но до усечения.

В POSIX вы можете использовать open с O_CREAT и без O_TRUNC.

+0

Справа я ошибся. Я думал о POSIX вместо «r +». Пристрастия к глупому вопросу :). – Akusete

0

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

Смежные вопросы