Запись ВСЕХ выходных данных программы в текстовый файл на С++

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

sOutFile << stdout;

где sOutFile — это объект потока, который создает такой файл:

sOutFile("CreateAFile.txt" ); // CreateAFile.txt is created.

Когда я вставляю стандартный вывод в объект sOutFile, я получаю некоторый код, напоминающий восьмеричный [шестнадцатеричный] код или какой-то адрес в созданном мной текстовом файле.

0x77c5fca0

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

Если этот код является адресом, будет ли он содержать все мои выходные данные? Могу ли я прочитать это обратно в программу и узнать таким образом?

Что я могу сделать, чтобы ВСЕ выходные данные моей программы записывались в текстовый файл?


person user40120    schedule 22.02.2009    source источник
comment
Я думаю, что оператор, который создает файл, должен быть «ofstream sOutFile (CreateAFile.txt);». Правильно?   -  person j_random_hacker    schedule 22.02.2009


Ответы (5)


Это дубликат: этот вопрос

Вы можете перенаправить stdout, stderr и stdin, используя std::freopen.

Из приведенной выше ссылки:

/* freopen example: redirecting stdout */
#include <stdio.h>

int main ()
{
  freopen ("myfile.txt","w",stdout);
  printf ("This sentence is redirected to a file.");
  fclose (stdout);
  return 0;
}

Вы также можете запустить свою программу через командную строку следующим образом:

a.exe > stdout.txt 2> stderr.txt
person Brian R. Bondy    schedule 22.02.2009

Если ваша программа уже использует cout/printf и вы хотите отправить ВСЕ, что вы в данный момент выводите, в файл, вы можете просто перенаправить stdout так, чтобы он указывал на файл перед вашими существующими вызовами: http://support.microsoft.com

Соответствующий код:

freopen( "file.txt", "w", stdout );
cout << "hello file world\n"; // goes to file.txt
freopen("CON", "w", stdout);
printf("Hello again, console\n"); // redirected back to the console

В качестве альтернативы, если вы просто хотите, чтобы некоторые вещи были напечатаны в файл, вам просто нужен обычный поток вывода файла: http://www.cplusplus.com/doc/tutorial/files.html

Соответствующий код:

ofstream myfile;
myfile.open("file.txt");
myfile << "Hello file world.\n";
printf("Hello console.\n");
myfile.close();

РЕДАКТИРОВАТЬ, чтобы объединить ответы Джона Т и Брайана Бонди:
Наконец, если вы запускаете его из командной строки, вы можете просто перенаправить вывод, как и все остальные, с помощью оператора перенаправления ">" или добавления ">>" :

myProg > stdout.txt 2> stderr.txt
person Andrew Coleson    schedule 22.02.2009
comment
добавление э... кажется, это то, что все делают с моим ответом на их. +1 за ваши усилия. - person John T; 22.02.2009
comment
Джоэл сказал, что хорошо бы вернуться к вопросу и объединить все хорошие ответы... это грязная работа, но кто-то должен это делать. И глупо оставлять ответ незавершенным, поскольку другие люди предлагают предложения, о которых вы не думаете, поэтому я пытаюсь проголосовать за вас и добавить его к своему. - person Andrew Coleson; 22.02.2009
comment
Вероятно, вам также следует упомянуть перенаправление stderr (с 2›x.txt или 2›&1, если я правильно помню). - person aib; 23.02.2009
comment
Не собирался вдаваться в подробности, но, думаю, стоит собрать данные для будущих поисков (и отдать должное Джону и Брайану). - person Andrew Coleson; 23.02.2009

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

из командной строки:

program > output.txt

Если вы хотите перенаправить только определенный вывод, вы можете использовать ostream, как было предложено dirkgent.

person John T    schedule 22.02.2009

Тогда вы больше нигде не сможете использовать std::cout для вывода данных из вашей программы. Измените std::cout на std::ostream, а затем передайте файл или std::cout по мере необходимости.

person dirkgently    schedule 22.02.2009

sOutFile << stdout;

в C "stdout" определяется как переменная FILE*. Это просто указатель. Вывод его в файл просто записывает значение указателя, в вашем случае: 0x77c5fca0 в файл.

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

person shoosh    schedule 22.02.2009