Как глобализировать файлы, которые я использую

#c #file #global

#c #файл #глобальный

Вопрос:

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

 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"); 
    ......}
  

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

Комментарии:

1. ваш вопрос не очень ясен. Это файлы, которые вы хотите глобализировать? Что именно вы подразумеваете под глобализацией. Вы имеете в виду объявлять как глобально, так и объявлять как extern или передавать в функции, возможно, как указатели? Как вы объявляете файлы? Это указатели на файлы, имена файлов или что? Не могли бы вы предоставить код, который у вас есть?

2. Я отредактировал вопрос для вас, проверьте это

3. смотрите отредактированный ответ в соответствии с вашим вопросом.

Ответ №1:

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

Ответ №2:

Используйте 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
}
  

Комментарии:

1. могу ли я просто поместить объявление в main вместо файла заголовка

2. @Анон, нет, ты не можешь. Объявление должно быть видно всем функциям, в которых вы собираетесь использовать эти файлы. Поместите это в файл заголовка, содержащий это namespace и добавляйте этот файл заголовка везде, где вы собираетесь использовать файлы.

3. я действительно не понимаю, что uv сделал после того, как я отредактировал свой вопрос, что именно мне делать

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

5. @Аноним, тогда ты можешь сослаться на ответ перед моей правкой . :). Это просто. Я отредактирую это снова.

Ответ №3:

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

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

внешняя пустота func1(); внешняя пустота func2();

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

Ответ №4:

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

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

 void func1(ifstream amp; infile, ofstream amp; outfile)
{
    ......
}
void func2(ifstream amp; infile, ofstream amp; 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 , то, что вы делаете с ними в одном, будет иметь эффект в другом. В частности, позиции поиска потоков будут сохраняться. Этого не было бы, если бы вы открывали их заново в каждой подфункции или передавали копии потоков, опуская amp; ‘s.)