重定向到文件时,输出会搞乱

时间:2014-04-03 09:22:18

标签: c

这是我正在进行打印的代码。将其显示在屏幕(终端)时输出正常。不幸的是,当你将它重定向到一个文本文件时,它会搞砸。它显示空字符(^ @)和查询字符(^ 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

3 个答案:

答案 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