2016-03-31 29 views
0

我试图读取文件和反向它的每一行,并在其下显示到标准输出C:与fgets在开始

我的文件返回一个额外的空行是:

$ 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

输出中多余的空白行在哪里? – nicomp

+1

您通过设计将换行符移至行首: –

+2

'while(fgets(line,128,fp)!= NULL)'行只有100字节大小。 sizeof是你的朋友在这里 – wildplasser

回答

0

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

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


我的丑的解决方法是:

printf("%s\n", sr+1); 

代替拳头的printf删除第二个。


请记住,当所有的失败,阅读手册:

与fgets()最多一个不到流大小人物和 并将它们存储到缓冲区读取s指针所指向。

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

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

0

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

asharma5 
love 
as23w 
love 
qwssdd 
love 

我的期望输出

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 ; 
    } 
    } 
} 

我得到的输出是增加爱每一个用户名。

asharma5love 
as23wlove 
qwssddlove 
+1

从问题中删除了C++标记吗? –