вывод потока в один и тот же текстовый файл из нескольких файлов .cpp одного проекта - PullRequest
2 голосов
/ 06 ноября 2010

Уважаемые все: у меня есть проект C ++ (в Visual Studio 2008), который содержит header.h, файл source_1.cpp, который содержит файл main () и source_2.cpp.

В определенные моменты вПрограмма, мне нужно вывести некоторые промежуточные результаты в текстовый файл, скажем, «output.txt».Дело в том, что я не могу этого сделать.То есть я не могу вывести результаты в один и тот же файл «output.txt» как из source_1.cpp, так и из source_2.cpp.Я использовал ofstream для своих операций записи в файл.

Например, в source_1.cpp я сказал

ofstream ofile("output.txt");

и позже в коде, который я бы сказал,

ofile<<"Result of intermediate calculation are "<<intermediate_result<<endl;

для сохранения результата в output.txt.

В source_2.cpp оказывается, что я не могу определить

extern ofstream ofile("output.txt");

(ошибка, что этот же объект былопределяется более чем в одном месте.)

Затем я попытался сказать в source_2.cpp

ofstream ofile_2("output.txt");//Note ofile_2 which is different from ofstream ofile in source_1.cpp

Однако использование ofile_2 в source_2.cpp приводит к удалению любого предыдущего вывода в записанный файлbyile в source_1.cpp.

Должен ли я использовать что-то кроме ofstream для записи в один и тот же файл из двух разных файлов .cpp?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 06 ноября 2010

Лучший способ: передать экземпляр типа ostream& всем клиентам, которым необходимо вывести результат. Я рекомендую не поддаваться искушению определить глобальные статические ostream объекты, видимые любому ...

2 голосов
/ 06 ноября 2010

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

std::ofstream file("output.txt", std::ios_base::out | std::ios_base::app)

Это скажет ofstream добавить файл.

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

1 голос
/ 06 ноября 2010

Каждый раз, когда вы создаете ofstream с одной и той же строкой имени файла, он будет перезаписывать то, что уже было там.

Инкапсулирует ofstream в классе, который его создает один раз, а затем записывает в него другие ваши классы, используя члены в глобально доступном экземпляре этого класса-оболочки. Этот класс может вызвать open() при первой запрошенной записи, если вы не всегда хотите записать этот файл.

Или (быстрее, но грязно) просто объявите ofstream в глобальном масштабе для всех пользователей.

Я бы обычно не поощрял глобально видимые данные в любой форме, но лог-файлы - это тот случай, когда это имеет смысл.

Вероятно, вам нужно реализовать мьютекс для передачи одновременных записей. Еще один аргумент для инкапсуляции ofstream в класс FileWriter или аналогичный. Если вы этого не сделаете, вы можете найти данные из одного потока, которые чередуются с данными из другого потока.

Если вы ожидаете, что ваши требования к ведению журнала станут более сложными, вы можете рассмотреть log4cpp вместо того, чтобы тратить все больше времени на эту периферийную область вашей логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...