【问题标题】:Usage of stderr in CC语言中stderr的使用
【发布时间】:2013-09-27 06:52:26
【问题描述】:

我正在尝试使用stderr,但我对它的用法完全感到困惑。我正要reply to a question asked here,但是当我想先尝试一下时,我发现自己卡住了。

我读到了stderr in this link,根据信息我尝试像这样使用它

FILE *stderr;

stderr = fopen("<path to file>","w");

.....//some code and conditions
fprintf(stderr,"found a error here");

使用它会给我一个段错误,我无法弄清楚为什么?

然后我使用freopen(),然后我也得到了段错误。stderr 本身是否将标准错误发送到某个默认文件而不是标准输出。

这是我的代码,我只是尝试将 stderr 用作任何其他 FILE * 指针。我可能完全将其视为错误的执行方式。或者它只将标准编译器错误写入某些默认文件。需要帮助。

#include<stdio.h>
#include<string.h>
#include<time.h>
FILE *stderr;

int main()
{
time_t start,end;
volatile long unsigned counter;
start = time(NULL);
for(counter = 0; counter < 500000000; counter++)
{}

int i;
char str1[]="XXXXXXX-XXXXXXXXX-YYYYYYYY-TTTTTT";
char str2[]="pro1_0.0";
char str3[]="CC";
char str4[]="ZZ";
char str5[]="QQ";
char serialstring[100];
stderr = fopen("path to file","w");
//freopen("llog.out","w",stderr);

printf("enter a serial string:");
scanf("%s",serialstring);
if((strstr(serialstring,str1)))
{
printf("String1  matched\n");
  if((strstr(serialstring,str2)))
   {
   fprintf(stderr,"str2 matched\n"); //it is where i tried using fprintf and stderr, rest of code is working pretty file 
      if((strstr(serialstring,str3)))
       {
          printf("str3 matched\n");
         }
      else if((strstr(serialstring,str4)))
           {printf("str4 matched\n");}
      else if((strstr(serialstring,str5)))
           {printf("str5 matched\n");
for(i=232;i<290;i++)
{
printf("Sending some values: %d\n",i);}}
    }
   else{printf("str2 not matched\n");}
}
else{printf("str1 not matched\n");}

end = time(NULL);
        printf("The loop used %f seconds.\n", difftime(end, start));
        return 0;
}

【问题讨论】:

  • 查看 R.. 的回答,但您应始终检查 fopen()freopen() 的结果以确保调用成功。如果调用不成功并且您尝试使用空指针,您可以获得核心转储。

标签: c file-io stderr


【解决方案1】:

您不应该尝试自己覆盖stderr。就用它吧。它由运行您的程序的程序提供给您。如果您的程序是从终端上的 shell 以交互方式运行的,那么 stdoutstderr 通常都会转到终端,但是有很多方法可以被覆盖。最常见的覆盖方式是调用者将stdout 重定向到文件以保存输出,但将stderr 连接到终端以便用户可以看到状态/错误消息。

【讨论】:

  • 所以 stderr 就像在控制台上打印任何错误消息一样。
【解决方案2】:

使用dup2():

int fd = open("mylog.txt", O_RDWR | O_APPEND | O_CREAT);
if (fd < 0) {
     printf("Cannot open mylog.txt!\n");
     exit(1);
}
if (dup2(fd, STDERR_FILENO) < 0) {
     printf("Cannot redirect stderr!\n");
     exit(1);
}

从此时起,任何对 stderr 的写入都将转到 "mylog.txt"

您也可以使用类似的方法重定向stdout - 只需使用STDOUT_FILENO

【讨论】:

  • 它对我有用...现在 stderr 很清楚了,虽然它非常基本...但重要的是要考虑
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多