C:fgets在开始时返回一个额外的空白行

时间:2016-03-31 23:25:49

标签: c

我正在尝试读取文件并反转它的每一行并将其显示为C中的标准输出。

我的档案是:

$ cat f1
this is line 1
this is line 2
this is line 3

我的代码是:

#include <stdio.h>
#include <string.h>

void reverse_string(char *s) {
    int l = strlen(s);
    int i;
    char sr[l];
    int j = 0;

    for (i = l - 1; i >= 0; i--) {
        sr[j] = s[i];
        j++;
    }
    printf("%s", sr);
}

int main(int argc, char *argv[]) {
    FILE *fp;
    int i;
    char filename[128];
    char line[100];

    for (i = 1; i < argc; i++) {
        strcpy(filename, argv[i]);
    }

    fp = fopen(filename, "r");

    while (fgets(line, 128, fp) != NULL) {
        if (strlen(line) != 0) {
            reverse_string(line);
        }
    }
    printf("\n");
}

输出是:

$ ./mycode f1
(blank line here)
1 enil si siht
2 enil si siht
3 enil si siht

我很困惑,为什么我的while循环会输出一个额外的空行,即使文件中没有空白行。

2 个答案:

答案 0 :(得分:0)

fgets在nul char之前包含'/ n'。

所以当你翻转一个字符串时,你要做的第一件事就是打印它。

我的丑陋修复是:

替换第一个printf
printf("%s\n", sr+1);

删除第二个。

请记住,当一切都失败时,请阅读手册。:

  

fgets()从流和中读取最多一个小于大小的字符   将它们存储到s指向的缓冲区中。

     

在EOF或换行符后停止阅读。 如果读取换行符,则会将其存储到缓冲区中。

     

终止空字节('\ 0')存储在缓冲区中的最后一个字符之后。

答案 1 :(得分:0)

我也试图从文件中读取。我的文件包含用户名,在读取用户名后,我需要为每个用户添加一个常量字符。但是当我正在读取文件时,输出中出现了不需要的空行,并且常量字符显示在空行而不是用户名。

  int main()
{
char buffer[20] ;
char i, j;
const char *a="love";
FILE *fp;

if ((fp = fopen("user.txt","r")) == NULL)
{
     perror ("Error opening file");
}
     while ( !feof(fp))
   {
    // read in the line and make sure it was successful
    if (fgets(buffer,20,fp) != NULL)
    {
        cout << buffer  << endl;                
               for(i = 0; buffer[i] != '\0'; ++i);

               for(j = 0; a[j] != '\0'; ++j, ++i)  
               {
                   buffer[i] = a[j];
                }
        buffer[i] = '\0' ;

        //cout << buffer << endl ;
     }  
   }
}

我正在获得这样的输出

asharma5
love
as23w
love
qwssdd
love

我想要的输出是为每个用户名添加爱。

asharma5love
as23wlove
qwssddlove