在Linux下运行一段C程序,如何将printf的结果保存至文本.txt中??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Linux下运行一段C程序,如何将printf的结果保存至文本.txt中??相关的知识,希望对你有一定的参考价值。

需要在程序中做哪些改动??
程序如下,就是一段关于复数加、减、乘计算的程序。
#include <stdio.h>
#include <stdlib.h>
struct complex

float real;
float imaginary;
;

void AddComplex(complex &c,complex c1,complex c2)

c.real = c1.real + c2.real;
c.imaginary = c1.imaginary + c2.imaginary;

void SubComplex(complex &c,complex c1,complex c2)

c.real = c1.real - c2.real;
c.imaginary = c1.imaginary - c2.imaginary;

void MulComplex(complex &c,complex c1,complex c2)

c.real = (c1.real*c2.real)-(c1.imaginary*c2.imaginary);
c.imaginary = (c1.real*c2.imaginary)+(c2.real*c1.imaginary);


void main()

complex c,c1,c2;
float r,r1,r2,r11,r12,r21,r22;
int node;
printf("please enter the number:\n");
printf("1:add complex;2:sub complex;3:mul complex\n");
scanf("%d",&node);
while(node!=0)

switch(node)


case 1:printf("please enter real and imaginary of c1\n");
scanf("%f,%f",&r11,&r12);
InitComplex(c1,r11,r12);
printf("please enter real and imaginary of c2\n");
scanf("%f,%f",&r21,&r22);
InitComplex(c2,r21,r22);
AddComplex(c,c1,c2);
printf("result:c=%f+i%f\n",c.real,c.imaginary);
break;
case 2:printf("please enter real and imaginary of c1\n");
scanf("%f,%f",&r11,&r12);
InitComplex(c1,r11,r12);
printf("please enter real and imaginary of c2\n");
scanf("%f,%f",&r21,&r22);
InitComplex(c2,r21,r22);
SubComplex(c,c1,c2);
printf("result:c=%f+i%f\n",c.real,c.imaginary);
break;
case 3:printf("please enter real and imaginary of c1\n");
scanf("%f,%f",&r11,&r12);
InitComplex(c1,r11,r12);
printf("please enter real and imaginary of c2\n");
scanf("%f,%f",&r21,&r22);
InitComplex(c2,r21,r22);
MulComplex(c,c1,c2);
printf("result:c=%f+i%f\n",c.real,c.imaginary);
break;

default:printf("finish!");

scanf("%d",&node);

在Linux下运行一段C程序,如何将printf的结果保存至文本.txt中??
real = c1,c2),&r21;finish需要在程序中做哪些改动;

void SubComplex(complex &c,&node),c:mul complex\,r12);;
AddComplex(c;
SubComplex(c,c2;%d".imaginary - c2,r22);
break;;n":c=%f+i%f\?;);
printf(",%f",r2;;
InitComplex(c1,r11;
;%d"
InitComplex(c1,&r11,complex c1.imaginary = c1;
case 2,r12);
InitComplex(c1;n",complex c1,%f".imaginary;;result,r11,c2);2,&r21,&r22).h>,r22;;);
InitComplex(c2;
scanf("n",c1;n");%f;n":add complex.imaginary,complex c2)

c;
while(node,c1,r1;3,complex c2)

c:printf("、减,c1。
#include <
#include <:c=%f+i%f\.real*c1.real*c2,r12;
c;
MulComplex(c;%f.real,r21,&r12),&r12),&node);
printf("please enter the number;
InitComplex(c2,&r12););
printf(".imaginary);
printf(":c=%f+i%f\:printf(",c2).real*c2;;1、乘计算的程序,%f"
float r!"?
程序如下;
printf(",r11,r22);
printf(",%f"n".imaginary).imaginary = (c1;

void MulComplex(complex &c,&r11,complex c1.imaginary + c2,c;
printf(".imaginary = c1.real + c2,就是一段关于复数加;
scanf("
int node.imaginary),%f",complex c2)

c,r21.real = (c1.real = c1;);,r21;
case 3;
printf(":sub complex,&r22);n"%f!=0)

switch(node)


case 1.real;
scanf("please enter real and imaginary of c2\.imaginary),c;);result;
float imaginary.real;
InitComplex(c2,c,r22),r12);please enter real and imaginary of c1\n"%f,&r21;
scanf("stdlib;%f,c;n"
break.real;result:printf(",r21.real)-(c1;

void AddComplex(complex &c,c1;
break;stdio;
scanf(".h>,&r22);
c,%f"please enter real and imaginary of c1\.real - c2;,&r11:printf(".imaginary););

default;


void main()

complex c;n"please enter real and imaginary of c1\,c;
struct complex

float real;n".imaginary)+(c2;please enter real and imaginary of c2\
scanf("
c;);

scanf(".imaginary*c2;);%f:\please enter real and imaginary of c2\,r11;
scanf(".real
输出重定向一下就好了吧,在终端里面运行你程序的命令后面加上 >>文件名 应该就好了
具体的你可以看下相关的函数用文件操作就好,或者使用fprintf就可以把你要打印的东西写到文件里去了

文件操作可以用open或者fopen打开,把你要写进去的文件先打开,然后用write函数写
打开开始菜单,点运行,输入cmd.exe然后在命令行方式下输入:

“d:\tc2\test.exe > d:\output.txt”

(注意,中文引号不要输入)
在Linux下运行一段C程序,如何将printf的结果保存至文本.txt中??~~~ 输出重定向一下就好了吧,在终端里面运行你程序的命令后面加上 >>文件名 应该就好了
一段c程序 在linux下编译运行时总提示命令不存在~~~ 可能是你的Path环境变量没有当前目录, ./copy.exe file1 file2 试试。 ./...
在Linux系统中,如何运行一个C语言程序?~~~ 如果已经写好了源文件,那么cd 进所在的目录 gcc filename.c -o filename ...
linux下运行一段简单的C语言程序 为什么结果不对 请高手指点~~~ 你的变量a没赋初值,系统会随机取出来一个数值,这个数值可能会很大,当你进行算术运算时,得到的结果超出...
能给我提供一段修改主机名的代码?用c语言实现,linux系统,不能直接用命令~~~      #include <unistd.h>   #include <stdio.h>   #i...
linux下运行C程序killed通常是哪些原因~~~ 估计是有内存泄露。仔细检查一下,如果是大程序,就悲剧了。 可以预先估计一下可能出问题的点,有针对性的...
急急,谁能帮我写一段在LINUX下的GCC中可以运行的显示倒计时的C语言代码!或者给一点提示也行!~~~ while循环显示,sleep(1),就是1秒循环显示一次 #include<unistd.h> #...
如何让linux的一段c程序进入内核态运行~~~ Linux内核的最初部分代码是用汇编语言写的(文件是boot/bootsect.s)。(我的汇编水平...
求解一段代码中几个问题 linux多线程的,C语言用的不太好~~~ 你的线程入口函数pthread有一个参数void *str,调pthread_create创建线程的...
C 语言适合在linux系统上学习还是在Windows系统上学习好?Windows系统上的开发就是用...~~~ 如果在linux下,随便建立一个文本文档,写一段c,然后改后缀为.c在终端里面运行一下 ogg,这就...
参考技术A 打开开始菜单,点运行,输入cmd.exe然后在命令行方式下输入:

“d:\tc2\test.exe > d:\output.txt”

(注意,中文引号不要输入)
参考技术B 用文件操作就好,把你要写进去的文件先打开,然后用write函数写,或者使用fprintf就可以把你要打印的东西写到文件里去了

文件操作可以用open或者fopen打开,具体的你可以看下相关的函数,不难的
参考技术C 输出重定向一下就好了吧,在终端里面运行你程序的命令后面加上 >>文件名 应该就好了追问

能否在程序中使用fopen之类的代码,进行自动的保存??
如果能的话,如何实现??

追答

可以的阿。
在函数开头:
FILE *fp = fopen(filepath, "a+");
if (fp == NULL)

//错误处理


函数中间将你的printf函数对应的替换成为fprintf函数就好了。fprintf的第一个参数是fp,后面就是你的printf函数的参数

在函数最后添加
if (fp != NULL)

fclose(fp);
fp = NULL;


每个需要替换printf的函数都对应的修改就好了

本回答被提问者采纳

如何在 C 中将 linux syslog 映射到 printf

【中文标题】如何在 C 中将 linux syslog 映射到 printf【英文标题】:How can I map linux syslog to printf in C 【发布时间】:2012-08-27 14:57:04 【问题描述】:

我的桌面上有一个 linux 应用程序正在运行,我想将 syslog() 调用重定向到 printf() 调用。

注意:我确实想替换调用,只是重定向

所以我写了一些代码来做到这一点:

#ifndef EMBED
#define syslog(level, stuff) printf("SYSLOG: %s\n", stuff)
#endif

在我使用它的一个文件中效果很好。我把它移到了一个新文件中并得到了一个错误:

error: macro "syslog" passed 3 arguments, but takes just 2

我知道错误是因为新文件中的调用是混合的,有些使用 2 个参数到 syslog,有些使用 3 个。我也知道我需要通过可变参数列表以某种方式重定向它,但我该怎么做做这个?我还没弄好...

据我了解,syslog() 和 printf() 应该是:

void syslog(int priority, const char *format, ...)
int printf(const char *format, ...)

所以我尝试了:

#define ERR 3
#ifndef EMBED         // This is not defined in my env, btw
#define syslog(pri, fmt, ...) printf(fmt, ...)
#endif
...
void main() 
...
syslog(ERR, "test");

但这给出了错误:

error: expected expression before ‘...’ token

关于这个宏的外观/使用方式的建议?

【问题讨论】:

宏无济于事除非您可以保证fmt参数将始终是字符串文字。 使用宏替换调用,而不是重定向。如果您只想重定向,您可能需要使用 RTLD_NEXT 查看 LD_PRELOAD。 【参考方案1】:

GCC 在这方面有一个扩展,但最便携的处理方式是:

#define syslog(priority, ...)    printf(__VA_ARGS__)

优先级是强制性的,但被宏扩展忽略。其余参数(强制格式加上可选的后续参数)在printf() 的参数列表中使用的__VA_ARGS__。无论格式字符串是常量(文字)还是变量,这都可以。


如果您想将输出标记为syslog() 的代理项,我会调用printf() 以外的函数来完成这项工作:

#define syslog(priority, ...) syslog_print(__VA_ARGS__)

甚至

#define syslog(priority, ...) syslog_print(__FILE__, __LINE__, __func__, __VA_ARGS__)

这些将被声明为:

extern void syslog_printf(const char *fmt, ...);

或:

extern void syslog_printf(const char *file, int line, const char *func,
                          const char *fmt, ...);

实现是&lt;stdarg.h&gt; 中的宏加上v*printf() 函数的直接应用:

void syslog_printf(const char *file, int line, const char *func,
                   const char *fmt, ...)

    va_list args;
    printf("SYSLOG:%s:%d:%s: ", file, line, func);
    va_start(args, fmt);
    vprintf(fmt, args);
    va_end(args);

您可以添加时间戳和您喜欢的任何其他内容;您还可以相当轻松地将输出安排到文件而不是标准输出;您还可以安排它在功能内打开或关闭。因此,平均而言,我会将syslog() 替换为一个代理项,该代理项允许您调整代码对设施的使用。

事实上,既然您发现了更改日志记录行为的要求,我建议您不要直接在代码中使用syslog(),而应该使用您自己的函数(例如,syslog_printf(),但可能使用不同的名称)在您的代码中,并为您提供该函数的各种实现。这样做的唯一缺点是调用真正的syslog() 现在更难了——没有vsyslog() AFAIK。因此,对syslog() 的基本调用将通过使用vsnprintf() 格式化syslog_printf() 中的字符串来完成(或vasprintf(),如果您可以使用并且内存耗尽不是可能的问题),然后调用@987654344 @ 带有预格式化的字符串 (syslog(priority, "%s", buffer);)。当然,您还希望将优先级传递给代理函数以中继到syslog()

【讨论】:

非常适合我。谢谢。 但这与 OP 想要的不同,即在字符串前面加上他自己的消息... :-S 这是你提到的vsyslog()吗? @dtmland:大概就是我提到的vsyslog() 的Solaris 实现。它可能在其他平台上可用,也可能不可用。如果定义了_BSD_SOURCE,我的Linux 机器上的手册页(一个Ubuntu 14.04 衍生产品,但我不知道这是否是衍生产品的一部分)也提供vsyslog()。 Mac OS X (10.10.3) 也有,不需要_BSD_SOURCE。我不记得 2012 年的现状。如果 HP-UX 和 AIX 也有(并非不可能),那么可移植性风险很小——除了 Windows。 (Gnulib 标识“在某些平台上缺少:Minix 3.1.8、AIX 5.1、HP-UX 11、OSF/1 5.1、mingw、MSVC 9、BeOS”,但该列表不是所有这些都是最新的;AIX 至少在版本 7 上,...)。【参考方案2】:

fmt 字符串应该包含它自己的格式说明符,这些说明符用可变参数填充。首先,您可以简单地 ignore 实际参数并打印格式化字符串。你需要一个可变参数宏:

#define syslog(level, fmt, ...) printf("SYSLOG: %s\n", fmt)

其次,如果您愿意冒巨大的风险并期望用户将格式化字符串作为文字而不是变量提供,您可以连接自己的字符串:

#define syslog(level, fmt, ...) printf("SYSLOG[%d] " fmt, level, ##__VA_ARGS__)

这适用于syslog(1, "Hello");,但不适用于syslog(1, str);

【讨论】:

【参考方案3】:

如果您不想依赖可变参数宏(C99 功能),您也可以这样做:

#define syslog my_syslog

static inline int my_syslog(int prio, const char *fmt, ...)

    int r;
    va_list ap;
    va_start(ap, fmt);
    r = vprintf(fmt, ap);
    va_end(ap);
    return r;

或类似的。

【讨论】:

以上是关于在Linux下运行一段C程序,如何将printf的结果保存至文本.txt中??的主要内容,如果未能解决你的问题,请参考以下文章

如何在linux中运行c程序

linux 中实现延迟45分钟后执行命令,写了一段c程序,实现延迟,接下来,该如何执行命令呢,也就是shell

如何在 C 中将 linux syslog 映射到 printf

求C语言程序:如何获得一个程序运行的时间? 最好带一段简单的代码 新人学不懂 呵呵 谢谢大家啦

怎样在linux下编写C程序并编译执行

交叉编译-如何编译Android平台的可执行程序