2014-02-13 8 views
0

Прошу прощения, если это совершенно глупый вопрос, но у меня все еще есть проблемы с ним.Создание потока в случае необходимости

Я пытаюсь передать два std::string fileNames к функции foo следующим образом:

Foo (интермедиат SomeValue, станд :: строка имя_файла1, станд :: строка filename2)

я тогда хочу чтобы проверить, что они оба имеют ли у FileName больше, чем "" следующим образом:

bool hasFile1 = true; 
if(fileName1.empty()) 
{ 
    hasFile1 = false; 
} 

Моя проблема имеет быть en, поскольку я хочу иметь возможность создать ofstream, если hasFile1 == true и то же самое для hasFile2, оба из которых должны использоваться позже в функции foo.

Я пытался делать такие вещи, как:

std::ofstream file1; 
if(hasFile1) 
{ 
    file1 = new std::ofstream(fileName1); 
} 

, но проблема с этим состоит в том, что file1 неполный тип. Другой метод, который я попробовал, был

std::ofstream* data; 
if(hasFile1) 
{ 
    data = new std::ofstream(fileName1)/std::ofstream(fileName1); 
} 

и все различные комбинации всех либо дают неполное описание типа не допускается ошибка или я не могу присвоить указателю.

Главный вопрос заключается в том, как вы назначаете ofstream, так что вам не нужно поддерживать 3 блока кода, которые имеют различные комбинации, из которых ofstreams используются?

Любая помощь будет очень признательна !!

+1

'BOOL hasFile1 = fileName1.empty();' - нет необходимости писать 4! линии, когда это будет сделано. – MSalters

ответ

2

Ошибка «неполного типа» будет вызвана тем, что вы не указали <fstream>, чтобы получить определение ofstream.

Первый не будет работать, потому что вы пытаетесь назначить указатель (возвращаемый new) объекту. В большинстве случаев вместо этого вы должны назначить объект; но, к сожалению, потоки не назначаются, даже перемещаясь.

Второй будет работать (один раз ofstream был определен), но это плохая идея, так как теперь у вас есть необработанный указатель на динамически выделенный ресурс. Вы, скорее всего, не удалите его правильно, не получите утечек памяти или других проблем.

Это можно смягчить, используя интеллектуальный указатель, а не необработанный указатель; но в случае ofstream, вы можете просто оставить его закрытым, если у вас нет файла, чтобы открыть:

std::ofstream file1; 
if(hasFile1) { 
    file1.open(fileName1); 
} 

Кроме того, нужно учитывать, что вы не инициализацию hasFile1 должным образом; и что вы обычно не можете сравнивать строки C-стиля, используя ==. Вы хотите что-то больше похоже на

bool hasFile1 = (fileName1[0] != '\0'); 

или, если изменить аргументы имени файла к более дружественным std::string

bool hasFile1 = !fileName1.empty(); 
+0

Отредактировал вопрос, чтобы отразить строки типа C++, и это был случай включения fstream. – Alex

1

Как передают строки как указатель, вы пытаетесь сравнить их с другим указателем (буквальный ""), который будет никогда быть правдой (если, конечно, вы не передать строку литерала ""и компилятор только хранит одну копию этого конкретного строкового литерала, чтобы указатель на этот литерал был общим).

Либо используйте std::string для строк, или если вы хотите, чтобы старый указатель строки C-стиля использовал std::strlen для проверки пустых строк.

0

Сравнение const char* в if(fileName1 == "") может не делать то, что вы ожидаете. Он сравнивает два указателя const char*, а не их значения. Используйте strlen() (отметьте нуль) или strcmp(), чтобы сравнить строки C.

И Вы указали fstream?

+0

проверить пустую строку C лучше всего сделать как 'if (! * Str)' – bobah

+0

Я включил iostream, поэтому я полагаю, что это также будет включать fstream – Alex

+0

@Alex: см. Этот http://stackoverflow.com/questions/2451681/why -do-i-need-to-include-both-the-iostream-and-fstream-headers-to-open-a-file – fritzone

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