2016-11-18 5 views
-1

У меня есть этот кодМогу ли я использовать ostream как поток?

ostream & operator<<(ostream & out, call_class & Org) 
{ 
    for (int i = 0; i<Org.count; i++) 
    { 
     out << Org.call_DB[i].firstname << " " << Org.call_DB[i].lastname 
      << " " << Org.call_DB[i].relays << " " << Org.call_DB[i].cell_number 
      << " " << Org.call_DB[i].call_length << endl; 
    } 

    //Put code to OPEN and CLOSE an ofstream and print to the file "stats7_output.txt". 


    return out; //must have this statement 
} 

Как говорит мне нужно использовать ofstream для печати содержимого out в файл, я могу просто бросить out как ofstream и использовать это?

Например, будет ли это работать?

new_stream = (ofstream) out; 

Это код в основной функции, которая вызывает эту функцию

cout << MyClass << endl; 

MyClass имеет тип call_class Предположим, что я не могу просто изменить параметр out быть типа ofstream

EDIT: Спасибо вам за помощь. Я знаю, что это был трудный вопрос для ответа из-за отсутствия четкой инструкции. Мой профессор в основном дал нам две разные версии одного и того же вопроса, и было непонятно, что он спрашивал. Я просто написал данные в файл за пределами функции, надеюсь, это будет достаточно хорошо.

+0

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

ответ

1

Вы не понимаете, как работает этот оператор. Так как функция принимает ostream &, она будет работать с любым классом, который происходит от ostream, например ofstream. Это означает, что все, что нам нужно сделать, это вызвать эту функцию на экземпляре ofstream, и вывод будет направлен на файл, к которому относится этот экземпляр. Это будет выглядеть так:

std::ofstream fout("some text file.txt"); 
call_class Org; 
// populate Org 
fout << Org; 

Теперь мы будем выводить в поток файлов. Функция вывода не заботится о том, куда она выводится, вы управляете этим с сайта вызова. Это также дает вам преимущество в том, что один и тот же оператор работает со всеми выходными потоками. Мы могли бы заменить fout на cout, некоторые stringstream или любые другие потоки, полученные от ostream.

+0

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

+0

Вам действительно нужно открыть файл внутри 'operator <<'? Это совершенно неожиданное поведение. – NathanOliver

+0

Что касается создания экземпляра 'ofstream', вы бы сделали это, как и в любом другом месте. – NathanOliver

1

Использование std::ostream, как написано, является правильным и идиоматическим. Для записи в файл, просто создать объект типа std::ofstream и использовать его в качестве объекта потока:

call_class org = /* whatever */ 
std::ofstream str("myfile.txt"); 
str << org; 

Это работает, потому что std::ofstream происходит от std::ostream, так что вы можете передать std::ofstream, где ссылка на std::ostream является ожидается. Это имеет фундаментальное значение для полиморфизма.

Кроме того, в случае, если есть еще путаница, что же вставки работает с любого рода std::ostream объекта:

call_class org = /* whatever */ 
std::cout << org; 
+0

Как я могу напечатать файл, используя функцию outstream внутри функции? Предположим, что я не могу изменить код, я могу только добавить к нему. также код должен быть реализован внутри функции, а не снаружи. Это домашнее задание, поэтому для меня важнее следовать инструкциям, чтобы он был эффективным. (Разве школа не замечательная?) –

+0

@MattD - достаточно легко написать функцию, которая копирует содержимое вашего объекта в поток файлов. Но это не будет выглядеть как 'operator << (std :: ostream &, call_class & obj)'. Это будет нечто вроде 'write (std :: string file_name, call_class & obj)'. –