Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Перенаправление потоков в С

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

vitls1



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вот есть такая программа:
 
#include <stdio.h>
 
int main(void)
{
fprintf(stdout, "test1\n");
fprintf(stderr, "test2\n");
return 0;
}
 
так вот, вопрос, как в шелле перенаправить вторую строку в файл?
Первая перенаправляется стандартно, то есть:
# test.exe > test.txt
А как перенаправить stderr?

Всего записей: 307 | Зарегистр. 02-06-2002 | Отправлено: 08:03 31-05-2004
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
 
# test.exe 2> test.txt  
 

под UNIX shells будет работать

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 10:11 31-05-2004
lucikan



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
такое вроде и под линейкой NT должно работать

Всего записей: 125 | Зарегистр. 13-08-2003 | Отправлено: 14:19 31-05-2004
JonnySilver



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Под NT и прочими Win не сработает, так как stderr - выводится только на консоль.
А вот так можно проблему решить. Вот справка и пример из MSDN:

Цитата:
These are standard streams for input, output, and error output.
 
By default, standard input is read from the keyboard, while standard output and standard error are printed to the screen.
 
The following stream pointers are available to access the standard streams:
 
Pointer Stream  
stdin Standard input  
stdout Standard output  
stderr Standard error  
 
These pointers can be used as arguments to functions. Some functions, such as getchar and putchar, use stdin and stdout automatically.
 
These pointers are constants, and cannot be assigned new values. The freopen function can be used to redirect the streams to disk files or to other devices. The operating system allows you to redirect a program's standard input and output at the command level.  
 
Example
 
/* FREOPEN.C: This program reassigns stderr to the file
 * named FREOPEN.OUT and writes a line to that file.
 */
 
#include <stdio.h>
#include <stdlib.h>
 
FILE *stream;
 
void main( void )
{
   /* Reassign "stderr" to "freopen.out": */
   stream = freopen( "freopen.out", "w", stderr );
 
   if( stream == NULL )
      fprintf( stdout, "error on freopen\n" );
   else
   {
      fprintf( stream, "This will go to the file 'freopen.out'\n" );
      fprintf( stdout, "successfully reassigned\n" );
      fclose( stream );
   }
   system( "type freopen.out" );
}


Всего записей: 151 | Зарегистр. 03-09-2003 | Отправлено: 21:19 31-05-2004 | Исправлено: JonnySilver, 21:29 31-05-2004
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
JonnySilver

Цитата:
Под NT и прочими Win не сработает, так как stderr - выводится только на консоль.

Сработает. Во всяком случае под XP. Сравни

Цитата:
C:\>dir /Z > out

и

Цитата:
C:\>dir /Z 2> out


----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 07:12 01-06-2004
JonnySilver



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
f_serg

Цитата:
C:\>dir /Z 2> out  

Да, так - работает.
 
Но, если сделать вот так:
#include <stdio.h>  
 
int main(void)  
{  
fprintf(stderr, "test2\n");  
return 0;  
}  
 
После запуска скомпиленой проги: test.exe >out.txt
Создается пустой out.txt, а на экране видим: test2

Всего записей: 151 | Зарегистр. 03-09-2003 | Отправлено: 07:48 01-06-2004 | Исправлено: JonnySilver, 08:22 01-06-2004
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
JonnySilver

Цитата:
После запуска скомпиленой проги: test.exe >out.txt
Создается пустой out.txt, а на экране видим: test2

Само собой.
> перенаправляет stdout, а 2> - stderr.

----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 11:56 01-06-2004
JonnySilver



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
f_serg

Цитата:
Само собой.  
> перенаправляет stdout, а 2> - stderr.

Вот поэтому stderr и лечится перенаправлением (freopen).

Всего записей: 151 | Зарегистр. 03-09-2003 | Отправлено: 12:50 02-06-2004
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
JonnySilver

Цитата:
Вот поэтому stderr и лечится перенаправлением (freopen).

Либо мы о разном говорим, либо я что-то не понимаю.
 

Цитата:
#include <stdio.h>  
 
int main(void)  
{  
fprintf(stderr, "test2\n");  
return 0;  
}

Скомпилировал.

Цитата:
E:\Work\1>ttt.exe > out
test2

Все правильно.

Цитата:
E:\Work\1>ttt.exe 2> out
E:\Work\1>cat out
test2

Тоже все правильно. Как и должно быть.

----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 07:53 03-06-2004
JonnySilver



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
f_serg

Цитата:
> перенаправляет stdout, а 2> - stderr.

Блин, все дело в Двойке, а я и не углядел сначала... Сори за запутку.

Всего записей: 151 | Зарегистр. 03-09-2003 | Отправлено: 17:31 03-06-2004
vitls1



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо всем, а как перенаправить stdout и stderr в файл одновременно?

Всего записей: 307 | Зарегистр. 02-06-2002 | Отправлено: 14:25 06-06-2004
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vitls1

Цитата:
Спасибо всем, а как перенаправить stdout и stderr в файл одновременно?


Код:
 
# test.exe > test.txt 2>&1
 


----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 08:52 08-06-2004 | Исправлено: f_serg, 08:52 08-06-2004
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Перенаправление потоков в С


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru