这是我正在进行打印的代码。将其显示在屏幕(终端)时输出正常。不幸的是,当你将它重定向到一个文本文件时,它会搞砸。它显示空字符(^ @)和查询字符(^ E)。我必须像这样使用for循环或者我的输出搞砸了。我不能使用%s选项,否则我的输出将不会像我需要的那样。
FILE *input;
char line[80] = {0};
while(fgets(line, 80, input) != NULL)
{
if((int)line[0] == 46)
{
//printf("You have a period \n");
for(i = 31; i < 80; i++)
{
printf("%c", line[i]);
}
//printf(" ------------------------\n");
memset(line, 0, 80);
comment_flag = 1;
}
}
这就是我说重定向时的意思。
gcc *.c
./a.out > text_file
答案 0 :(得分:0)
它可能很傻,但如果在你的文件中,你看到你的空/空数组位置要用特殊字符(^ @)显示,那么你所要做的就是用空格来初始化数组,或者更好用'\ 0'。
你甚至可以在程序的顶部执行一次,如果它不起作用,请在将行打印到所需的文件后,在while循环中每次都这样做。
while(fgets(line, 80, input) != NULL)
{
//Your code here
for(i=0; i<80; i++)
line[i]='\0';
}
只需删除“memset”功能并尝试此操作。
答案 1 :(得分:0)
如果您只想将输出从屏幕替换为文件,则只需执行此操作
#include <stdio.h>
int main ( void )
{
int i;
FILE *file = fopen ( "test.txt", "r" );
FILE *out = fopen ( "output.txt", "w");
if ( file != NULL )
{
char line [ 128 ]; /* or other suitable maximum line size */
while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
{
if((int)line[0] == 46)
{
//printf("You have a period \n");
for(i = 31; i < 80; i++)
{
fputs(line,out);
}
}
}
fclose ( file );
fclose ( out );
}
return 0;
}
如果您使用fputs
替换printf
,则会正确地写入文件,而不会显示任何特殊字符,也可以写入您的屏幕,就像您在顶部的答案一样。如果我做对了,那就是你想要的。
答案 2 :(得分:0)
#include <ctype.h>
并尝试
if (isprint((unsigned char)line[i]) || isspace((unsigned char)line[i]))
printf("%c", line[i]);
条件中的条件仅保留可打印字符(isprint()
)和空格字符('\n'
,'\t'
,...)。其他字符('\0'
,'\x05'
,...)只是被忽略输出。 - pmg