2013-04-04 2 views
0

У меня есть функция, которая получает переменную ifstream, но мне приходится писать в этот файл в некоторых ситуациях. Например.ifstream -> ofstream C++

main() 
{ 
    ifstream dataFile("filename.txt"); 
    foo(dataFile); 
} 

void foo(ifstream &df) 
{ 
    if(df.good()) {...} 
    else { 
    //here I need to write str into the "filename.txt" 
    //but I don't know how to do it properly! 
    } 
} 

Как я могу себе представить, самый простой способ, чтобы получить как-то имя файла из ДФ в Foo() ... Но как?

себе: Я НЕ МОЖЕТ использовать fstream. По какой-то причине У меня есть только ifstream & и не знаю название файла. . Я получаю ifstream & из некоторой функции закрытой библиотеки.

+0

Не пропускайте поток по значению, передайте его по ссылке. 'void foo (ifstream & df)' – andre

+0

Можете ли вы передать имя файла в качестве параметра foo? Если вы можете, просто создайте экземпляр std :: ostream (filename) внутри foo и поработайте с ним. В противном случае вы можете заменить ifstream на fstream (который поддерживает оба) ввода и вывода. – utnapistim

+2

Не можете ли вы изменить функцию так, чтобы вместо 'ifstream' вместо' ifstream' вместо 'fstream' потребовался' fstream'? 'Ifstream' специально предназначен для * чтения * из файла, а не для записи. –

ответ

4

Использование fstream вместо ifstream:

fstream dataFile("filename.txt",ios::in | ios::out | ios::app); 

При этом вы можете читать и писать в файл.

И КУРС, передайте свой объект Fstream по ссылке, а не по значению. fstream не копируется.

+1

Не то, чтобы это было уместно здесь, и не имеет никакого отношения к ответу, но с C++ 11 потоки перемещаются. –

+0

@PeteBecker интересно знать, спасибо. Хотя я не вижу причины, по которой нужно пройти филе по стоимости ... Я думаю, что парень в вопросе проходит мимо стоимости только из-за отсутствия опыта. –

+0

спасибо за & - я знаю. Опечатка. –

1

К сожалению, с учетом ваших ограничений, у вас есть только ifstream и нет имени файла, нет никакого переносного способа записи в этот файл.

может быть непереносимыми способами решения этой проблемы. Например, некоторые реализации unix могут предоставлять функцию fd на объекте filebuf, который вы можете получить от rdbuf в ifstream. Windows может или не может предоставить аналогичную возможность.

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

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