我有以下代码,如果我尝试将其重定向到文件,则不会输出任何提示。它将提示和结果输出重定向到我的文件。
有没有办法让它输出提示到stdout然后输出到文件?
/*prints chars in rows and columns*/
#include <stdio.h>
void display(char cr, int lines, int width); /*prototypes are fun*/
int main(void) {
int ch; /*char to be printed*/
int rows, cols; /*number of rows and columns*/
printf("Enter a character and two integers.\n");
while((ch = getchar()) != '\n') {
if(scanf("%d %d", &rows, &cols) != 2) {
break;
}
display(ch, rows, cols);
while(getchar() != '\n') {
continue;
}
printf("Enter another character and two integers. Newline quits.\n");
}
return 0;
}
void display(char cr, int lines, int width) {
int row, col;
for(row = 1; row <= lines; row++) {
for(col = 1; col <= width; col++) {
putchar(cr);
}
putchar('\n');
}
}
答案 0 :(得分:1)
您可能希望将文件名设为(可选)命令行参数。
要执行此操作,您可以更改main
的开头,如:
int main(int argc, char** argv) {
FILE* outfile;
if (argc == 2) outfile = fopen(argv[1], "w");
else outfile = stdout;
(为安全起见,如果打开文件时出错,您应该检查outfile
是否为空。您可能还想检查命令行参数的数量是否不正确,发出帮助消息,依此类推,取决于该计划的目标。)
然后你必须将此FILE*
传递给display
函数,这需要更改该函数签名,如
void display(char cr, int lines, int width, FILE* outfile) {
最后,将putchar
来电更改为putc
,以便将其发送到文件中,例如
putc('\n', outfile);
毕竟,运行你的程序,如
./myprog
将打印所有提示以及输出到stdout,而用
这样的文件名运行它./myprog file.txt
仍会将提示打印到stdout,但另一个输出将转到file.txt
。
答案 1 :(得分:0)
在处理重定向输出到文件时,您可以使用freopen()。
虽然它不是一个好的解决方案,但它是一个很好的例子,如何使用freopen()
。假设您尝试将stdout
重定向到文件&#39; output.txt&#39; ,那么您可以写 -
freopen("output.txt", "a+", stdout);
此处&#34; a +&#34; 用于追加模式。如果文件存在,则文件以追加模式打开。否则会创建一个新文件。
重新打开stdout
并freopen()
所有输出语句(printf
,putchar
)重定向到&#39; output.txt&#39; 即可。因此,当您尝试在终端/命令提示符中再次重定向'printf("Enter another character and two integers. Newline quits.\n");'
语句时,您必须使用以下代码再次重新分配stdout
-
freopen("/dev/tty", "w", stdout); /*for gcc, ubuntu*/
或
freopen("CON", "w", stdout); /*Mingw C++; Windows*/
以下是完整代码 -
/*prints chars in rows and columns*/
#include <stdio.h>
void display(char cr, int lines, int width); /*prototypes are fun*/
int main(void) {
int ch; /*char to be printed*/
int rows, cols; /*number of rows and columns*/
printf("Enter a character and two integersk.\n");
while((ch = getchar()) != '\n') {
if(scanf("%d %d", &rows, &cols) != 2) {
break;
}
freopen("output.txt", "a+", stdout);
display(ch, rows, cols);
freopen("/dev/tty", "w", stdout); /*for gcc, ubuntu*/
//freopen("CON", "w", stdout); /*Mingw C++; Windows*/
printf("Enter another character and two integers. Newline quits.\n");
while(getchar() != '\n') {
continue;
}
fclose(stdout);
}
return 0;
}
void display(char cr, int lines, int width) {
int row, col;
for(row = 1; row <= lines; row++) {
for(col = 1; col <= width; col++) {
putchar(cr);
}
putchar('\n');
}
return;
}
由于