2016-12-03 70 views
1

我有一个文件,该文件存储在用户的输入(标准输入)串在文件的结尾删除新的空行

然而,有2种情况

如果我正常读取它,我的文件将有由于用户引入的最后一个字符串中的换行符,在其末尾处为空行。

如果我从输入字符串中删除\n,则文件将所有字符串存储在同一行中,这是不需要的。

如何从文件末尾简单地删除该新行?

如果需要,我可以编辑并提供一些我的代码。

编辑:比方说,一个文件我已经有了的最后一行是“卡”

当光标在“卡”前,如果我按向下箭头它不转到下一行,而在这种情况下,它可能发生一次。

对于我的代码功能完美,我不能让这种情况发生,

这里是什么,我有一个例子:

f=fopen(somefile, "w"); 
do 
{ 
    fgets(hobby, 50, stdin); 
    fprintf(f, "%s", hobby) 

} while(strcmp(hobby,"\n") != 0); 
+1

你如何阅读这些文字?你如何储存这些线?你在哪里储存线?你能否请尝试创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)并向我们展示? –

+0

如果您使用奇怪的编辑器来查看它,它只会在其末尾显示一条空行。通常情况下,唯一不以'\ n'结尾的文本文件是空文件(包含0行)。 – melpomene

+2

也许你正在用文本编辑器查看文件,并认为有一个“额外的行”,因为光标位于下一行。事实并非如此,那只是下一行尚未存在的第一个字符的打字位置。 –

回答

4

在文件末尾的换行符是最后一行的部分。删除它是可能的,但使最后一行不完整,这将打破许多程序。例如,连接此文件末尾的另一个文件将导致最后一行与连接文件的第一行合并。

Yuri Laguardia评论说,如果您以后在附加模式下重新打开此文件以写入更多行,则添加的第一个将在此最后一个不完整行的末尾连接起来。可能不是预期的行为。

如果您不希望该文件包含空行,写入行到文件之前检查用户输入:

void input_file_contents(FILE *fp) { 
    char userinput[80]; 
    printf("enter file contents:\n"); 
    while (fgets(userinput, sizeof userinput, stdin)) { 
     if (*userinput != '\n') { 
      fputs(userinput, fp); 
     } 
    } 
} 

编辑:

您的代码不会在测试结束正确的地方:你在之前写空行测试。不要使用do/while循环:

f = fopen(somefile, "w"); 
if (f != NULL) { 
    /* read lines until end of file or empty line */ 
    while (fgets(hobby, 50, stdin) != NULL && *hobby != '\n') { 
     fputs(hobby, f); 
    } 
} 

换行符实际上是遗留系统对字节<CR><LF>的。

+0

如果OP只是决定在追加模式下再次打开同一文件以添加更多行,则会发生同样的不良行为,所以我完全同意这个答案。 – yLaguardia