Передать ссылку на std::ifstream в качестве параметра

Я пытаюсь написать функцию с аргументом ifstream&.

void word_transform(ifstream & infile)
{
    infile("content.txt");
    //etc
}

что дало мне ошибку:

Тип 'ifstream' (также известный как 'basic_ifstream') не предоставляет оператора вызова.

Не могли бы вы порадовать меня, что не так?


person Newbie    schedule 16.12.2014    source источник
comment
infile.open("content.txt"); предположительно.   -  person user657267    schedule 16.12.2014
comment
Функции, принимающие аргументы потока, обычно работают с уже открытым потоком. Например, ifstream s("content.txt"); word_transform(s);.   -  person molbdnilo    schedule 16.12.2014


Ответы (5)


оператор вызова — это функция, аналогичная operator()( params ), позволяющая использовать синтаксис myObject( params ).

Итак, когда вы пишете infile(...), вы пытаетесь нам позвонить оператору.

То, что вы пытаетесь сделать, это открыть файл, используя метод open:

void word_transform(ifstream & infile)
{
    infile.open("content.txt",std::ios_base::in);
    if ( infile.is_open() )
        infile << "hello";
    infile.close();
}

Но, как было сказано, нет смысла передавать ссылку в файл на такую ​​функцию. Вы можете рассмотреть:

void word_transform(istream& infile)
{
    infile << "hello";
}

int main()
{
    ifstream infile;
    infile.open("content.txt",std::ios_base::in);
    if ( infile.is_open() )
        word_transform( infile );
    infile.close();
    return 0;
}

Or:

void word_transform()
{
    ifstream infile;
    infile.open("content.txt",std::ios_base::in);
    if ( infile.is_open() )
        infile << "hello";
    infile.close();
}

int main()
{
    word_transform();
    return 0;
}
person jpo38    schedule 16.12.2014
comment
Ваш последний комментарий очень уместен: если он собирается открывать и закрывать файл в функции, std::ifstream должен быть локальным для функции; нет смысла использовать его в качестве аргумента. Однако более частой идиомой было бы открывать и закрывать его вызывающей стороной и передавать аргумент std::istream& (а не std::ifstream&). - person James Kanze; 16.12.2014

Вы пытаетесь вызвать operator() для своего параметра. Это не будет работать. Вы пытаетесь открыть файл? Если вы получаете параметр ifstream as, он должен быть открыт с самого начала, потому что вы открыли его вне своей функции. Передавать поток, а затем открывать его внутри своей функции не имеет смысла.

void word_transform(std::ifstream& infile)
{
    // read something from infile
}

int main()
{
   std::ifstream file("content.txt");

   // error checks

   word_transform(file);

   return 0;
}
person nvoigt    schedule 16.12.2014

Насколько я понимаю, оператор вызова - operator(), который, по-видимому, не определен для ifstream. Вы должны сделать что-то другое с аргументом word_transform.

person Codor    schedule 16.12.2014

infile("content.txt");

Обратите внимание, что это попытается вызвать operator() для уже созданного объекта типа infile. Поскольку в ifstream такого оператора не существует, вы получили ошибку.

Скорее вы должны сделать: -

infile.open("content.txt");
person ravi    schedule 16.12.2014

Обычно потоки (ссылки на) передаются функциям для ввода/вывода. Это означает, что функция должна принимать аргумент std::istream или std::ostream, но не std::ifstream или std::ofstream. Таким образом, вашу функцию можно использовать с любым объектом потока, производным от std::istream, включая std::cin, std::istrstream и std::ifstream.

Как сказал nvoigt, передача std::ifstream функции для открытия не имеет особого смысла. Вызывающему определенно не ясно, что его поток может быть закрыт и открыт для другого файла.

person Walter    schedule 16.12.2014