fstream, ofstream, передача имени документа, C++

Я пытаюсь передать имя документа для открытия в fstream, он работает с ofstream, но не с fstream.

Например, это работает нормально...

void TestFunction (ofstream &test,char FileName []){
    cout << "test !!!" << endl;
    test.open(FileName);
    test << "test test test" << endl;
    test.close();
}

int main ()
{
    ofstream database;
    char FileName[100]="database.txt";

    TestFunction(database, FileName);
    getchar();
    return 0;
}

Пример 2, это не создает файл...

void TestFunction (fstream &test,char FileName []){
    cout << "test !!!" << endl;
    test.open(FileName);
    test << "test test test" << endl;
    test.close();
}

int main ()
{
    fstream database;
    char FileName[100]="database.txt";

    TestFunction(database, FileName);
    getchar();
    return 0;
}

У кого-нибудь есть предложения, что я делаю неправильно?

РЕДАКТИРОВАТЬ Еще немного погуглив, я нашел ответ на свой вопрос, мне следует удалить свой вопрос сейчас или? c++: проблема открытия ifstream с передачей строка для имени текстового файла


person Cokaric    schedule 06.10.2013    source источник
comment
Я не думаю, что ваша проблема в том, что файл не создается с опубликованным кодом   -  person P0W    schedule 06.10.2013


Ответы (1)


Чтобы ваша вторая версия работала, вы можете добавить флаг ios_base::out:

void TestFunction (fstream &test,char FileName []){
    cout << "test !!!" << endl;
    test.open(FileName, std::ios::out);
    //                  ^^^^^^^^^^^^
    test << "test test test" << endl;
    test.close();
}

Если вы просто хотите записать содержимое в файл, вы можете выбрать более конкретную версию — std::ofstream.

Однако, поскольку конструктор basic_ofstream принимает const char* as input parameter, so it doesn't acceptstd::string`, в C++11 это изменилось.

explicit basic_ofstream( const char* filename,
                ios_base::openmode mode = ios_base::out );  // before C++11

explicit basic_ofstream( const string& filename,                                  
                ios_base::openmode mode = ios_base::out );  //  (since C++11)
person billz    schedule 06.10.2013
comment
Итак, теперь у меня есть 2 решения? :) Можете ли вы объяснить мне немного больше? Если я правильно понял, что поток добавляет std::ios::out автоматически, а fstream - нет? Почему c_str() работает? - person Cokaric; 06.10.2013
comment
Во втором примере Op я могу создавать и записывать в файл без std::ios::out, открытие fstream имеет режим открытия по умолчанию как ios_base::in|ios_base::out - person P0W; 06.10.2013
comment
@ P0W кажется, я ошибаюсь, я проверил, что у него тоже есть флаг. я удалю свой ответ - person billz; 06.10.2013
comment
@billz все в порядке, отредактируйте, я думаю, что ОП делал что-то std::string - person P0W; 06.10.2013
comment
P0W и billz, Спасибо, проверю, уже несколько лет не программирую. Потребуется некоторое время, чтобы вернуться в игру :) Полный код здесь... pastebin.com/nV0TC76K @billz, ваш ответ работает нормально, я просто не совсем его понимаю, но я прочитаю документацию, спасибо :) - person Cokaric; 06.10.2013