2012-04-27 5 views
1

У меня есть программа, которая принимает несколько файлов в качестве входных данных. Что я пытаюсь сделать, это использовать тот же самый поток? Я продолжаю получать сообщение об ошибке при попытке открыть поток со вторым файлом. Почему код недействителен и создает ошибку во время компиляции? argv [2] является const char *.Повторное использование фильтра в C++?

ошибка: не подходит для вызова «(станд :: ifstream) (символ * &)»

ifstream fin(argv[1]); 
    //work with filestream 
fin.close(); 

fin(argv[2]); 
    //work with filestream 
fin.close(); 
+0

Ничего себе, возможно, звание конструктора было плохой привычкой входить в короткую руку. Спасибо, что решил мою проблему. – LF4

ответ

5

Первая строка ifstream fin(argv[1]); является вызывающий конструктор ifstream «s, и конструктор может быть вызван только один раз на объект. Ваш код пытается вызвать его во второй раз. Попробуйте использовать вместо open():

fin.open(argv[2]); 

Как и в сторону, вы также можете позвонить clear(), прежде чем возобновить свой ifstream. Причиной этого является то, что если первый open() (или даже close()) терпит неудачу, биты ошибок на ifstream будут установлены и не будут очищены функцией close().

+0

Ничего себе, может быть, вызов конструктора был плохой привычкой входить в короткую руку. Спасибо, что решил мою проблему. – LF4

+1

@ LF4 Я бы сказал, наоборот, его отличная привычка. RAII - одна из самых мощных конструкций C++. –

+0

@AndreasBrinck. Вы избили меня до этого;) – luke

1

Используйте локальную область видимости:

{ 
    ifstream fin(argv[1]); 
    //work with filestream 
} 

{ 

    ifstream fin(argv[2]); 
    //work with filestream 
} 

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

+0

Это тоже хорошее решение, хотя локальный охват может выглядеть странным для непосвященных. Не нужно беспокоиться о флажках ошибок, это плюс. – luke

+1

Как я уже сказал в своем другом комментарии, это хорошая общая привычка. Я всегда стараюсь максимально ограничить область моих переменных. –

+1

@AndreasBrinck Отличный способ ограничить область действия - создать функцию. –

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