Как глобализировать файлы, которые я использую - PullRequest
1 голос
/ 03 июня 2011

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

void func1()
{
    ifstream infile;
    ofstream outfile;
    infile.open(" input.txt");
    outfile.open("output.txt"); 
    ......}

void func2()
{
    ifstream infile;
    ofstream outfile;
    infile.open(" input.txt");
    outfile.open("output.txt"); 
    ......}

Мне нужно использовать файлы объявлений только один раз, а не каждый раз в каждой функции, как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 04 июня 2011

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

Несмотря на это, я не уверен, что вам нужно глобализировать ваши данные.Для вас может быть лучше передать все, что, по вашему мнению, вы будете совместно использовать между двумя функциями, в качестве параметров:

void func1(ifstream & infile, ofstream & outfile)
{
    ......
}
void func2(ifstream & infile, ofstream & outfile)
{
    ......
}
int main()
{
    ifstream infile;
    ofstream outfile;
    infile.open(" input.txt");
    outfile.open("output.txt"); 

    func1(infile, outfile);
    func2(infile, outfile);

    return 0;
}

Теперь, когда ваша функция main заботится о присвоении имен, объявлении и открытиифайлы, подфункции могут сосредоточиться на своих реальных задачах.Кроме того, вы можете вызывать func1 и func2 с файлами, отличными от «input.txt» и «output.txt», без необходимости вносить изменения в сами функции.Наличие объектов в области действия функции, а не в глобальном масштабе, также облегчает отслеживание происходящего, поскольку становится более понятным, какой код работает с какими данными.

(Обратите внимание, что поскольку время жизнипотоки охватывают func1 и func2, то, что вы делаете с ними в одном, будет влиять на другое. В частности, позиции поиска потоков будут сохраняться. Это не будет иметь место, если вы открыли их зановов каждой подфункции или передается в копиях потоков, пропуская &.)

0 голосов
/ 03 июня 2011

Используйте namespace для объявления файлов:

//files.h
namespace FILES
{
  extern ifstream infile;
  extern ofstream outfile;
}

И определить эти файловые объекты внутри .cpp файла

//files.cpp
ifstream FILES::infile ("input.txt");
ofstream FILES::outfile ("output.txt");

Использование:

void func1 ()
{
  //use FILES::infile and FILES::outfile
}
void func2 ()
{
  using namespace FILES;  // to avoid writing FILES:: always
  //use infile and outfile
}
0 голосов
/ 03 июня 2011

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

Определите функции в файле .cpp / .h, и вы можете использовать эту функцию там, где требуется, написав следующую строку:

extern void func1 (); extern void func2 ();

если вы не хотите использовать пространство имен, упомянутое выше. Но приведенный выше ответ хорош.

0 голосов
/ 03 июня 2011

Вы можете поместить эти функции в отдельный класс.то, что вам нужно сделать, это создать объект класса, где бы вы ни захотели вызывать функции.это повторное использование calle

...