Предайте препратка към 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 като параметър, той трябва да е отворен от самото начало, защото сте го отворили извън вашата функция. Преминаването на поток и след това отварянето му във вашата функция няма смисъл.

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

Обикновено (препратките към) потоци се предават на функции за I/O. Това означава, че функцията трябва да приема 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