#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.)