其他
如何优雅地将printf的打印保存在文件中?
写文件
#include<stdio.h>
int main(void)
{
FILE *fp = fopen("log.txt","w+");
if(NULL == fp)
{
printf("open failed\n");
return -1;
}
int a = 10;
fprintf(fp,"test content %d\n",a);
fclose(fp);
return 0;
}
重定向
0 标准输入 1 标准输出 2 标准错误
#include<stdio.h>
#include <unistd.h>
int main(void)
{
sleep(20);//为了避免立即退出
return 0;
}
$ ./test &
$ ls -l /proc/`pidof test`/fd
其输出结果如下(可左右滑动查看完整内容):
lrwx------ 1 root root 64 Nov 16 16:26 1 -> /dev/pts/0
lrwx------ 1 root root 64 Nov 16 16:26 2 -> /dev/pts/0
/dev/pts/0
path:需要重定向到的文件名或文件路径。 mode:代表文件访问权限的字符串。例如,"r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。 stream:需要被重定向的文件流。
#include<stdio.h>
#include <unistd.h>
int main(void)
{
FILE *fp = freopen("test.log","w",stdout);
if(NULL == fp)
{
printf("reopen failed\n");
return -1;
}
printf("bianchengzhuji\n");
printf("shouwangxiansheng\n");
sleep(20);//便于观察
fclose(fp);
return 0;
}
lrwx------ 1 root root 64 Nov 16 16:34 1 -> /data/workspaces/test.log
lrwx------ 1 root root 64 Nov 16 16:34 2 -> /dev/pts/0
怎么恢复?
#include <unistd.h>
int main(void)
{
char ttyName[128] = {0};
ttyname_r(1,ttyName,128);//1为标准输出
FILE *fp = freopen("test.log","w+",stdout);
if(NULL == fp)
{
printf("reopen failed\n");
return -1;
}
printf("bianchengzhuji\n");
printf("shouwangxiansheng\n");
sleep(20);
freopen(ttyName,"w+",stdout);
printf("std out to %s\n",ttyName);
fclose(fp);
return 0;
}
std out to 打印到终端 打开的文件描述符1被重定向到/dev/pts/0
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void)
{
int fd = open("test.log",O_WRONLY|O_CREAT);
dup2(fd,1);//1代表标准输出
printf("bianchengzhuji\n");
printf("shouwangxiansheng\n");
sleep(20);
close(fd);
return 0;
}
l-wx------ 1 root root 64 Nov 17 17:03 1 -> /data/workspaces/test.log
lrwx------ 1 root root 64 Nov 17 17:03 2 -> /dev/pts/0
l-wx------ 1 root root 64 Nov 17 17:03 3 -> /data/workspaces/test.log
如何关闭printf打印
总结
相关精彩推荐