更改单词顺序功能"错误" C

时间:2014-11-29 11:49:02

标签: c linux

我在C中执行一个程序,逐行更改文件的行顺序。问题是,一旦我应用函数"更改",它首先打印一个空行。

这是可以在不反转文件第一行的情况下运行的代码,注释是替换fprintf( stdout, "%s", fgets(line, 2048, file));的行

   #include <stdio.h>
   #include <unistd.h>
   #include <sysexits.h>
   #include <stdlib.h>
   #include <string.h>


   char* change ( char *word ){
            int i;
            int j;
            char aux;
            for(i=0, j=strlen(word)-1 ; i<j ; i++, j--){
               aux=word[i];
               word[i]=word[j];
               word[j]=aux;
            }
                 return word;
  }

  int main(int argc, char *argv[])
  {
    char line[2048];
    FILE *file;
    file = fopen( argv[1], "r" );
    printf( "File: %s -> ", argv[1] );
    if( file )
    printf( "Exists (OPEN)\n" );
    else
    {
     printf( "Error (CAN'T OPEN)\n" );
      return 1;
    }

   printf( "The first line of the file: %s\n\n", argv[1] );
    /*fprintf( stdout, "%s", change(line) );*/
     fprintf( stdout, "%s", fgets(line, 2048, file)); 

   if( !fclose(file) )
    printf( "\nFile closed\n" );
    else
   {
     printf( "\nError: can't close \n" );
    return 1;
   }

   return 0;
   }

使用文件days.txt

   Monday
   Tuesday
   ...

使用fprintf( stdout, "%s", fgets(line, 2048, file));打印Monday,但fprintf( stdout, "%s", change(line) );应打印yadnoM,但打印空行并且我不知道原因。 (请注意,我在Ubuntu编程)

提前致谢。

2 个答案:

答案 0 :(得分:1)

我没有验证您代码的其他部分..

但对于这部分......

在调用这个fprintf之前(stdout,“%s”,更改(line)); ...你必须从文件中复制缓冲行中的数据...而不是在'line'中复制你传递这个以改变功能

你应该这样做

fprintf( stdout, "%s", fgets(line, 2048, file));
fprintf( stdout, "%s", change(line) );  

fgets(line, 2048, file);
fprintf( stdout, "%s", change(line) );  

答案 1 :(得分:0)

看起来当你运行fgets()时,它会读取整行,包括换行符\ n。

所以当你运行change(fgets(line, 2048, file))时,它基本上将\ n移动到文件的开头,所以你得到一个空行。