从 .txt 文件 C 读取时重复最后一个字符串

Posted

技术标签:

【中文标题】从 .txt 文件 C 读取时重复最后一个字符串【英文标题】:Repetition of the last string when reading from .txt file C 【发布时间】:2018-07-15 15:14:01 【问题描述】:

这是代码,它从文件中读取,然后打印该文件中写入的内容。 我不知道为什么,但是文件的最后一个字符串被读取了两次。

代码

FILE* src = fopen(name_email_src, "r");
if (src == NULL)

    printf("ERROR source file not found");

while(fgets(buff_src, sizeof(buff_src), src) != NULL)

    fputs(buff_src, stdout);

fclose(src);
printf("%s", buff_src);

这是输出:

Date: Tue, 07 Feb 2017 21:32:46 +0100 (CET)
From: Rental <rental@house-rental.com>
To: me <me@upf.edu>
Message-ID: message2
Subject: Paga el alquiler ya.

Dear customer,

you are late in your payment, please pay or LEAVE!

Sincerely yours,
House rental
House rental

我能做些什么来解决这个问题?谢谢。

【问题讨论】:

使用调试器单步调试程序会很快告诉你问题出在哪里。 为什么代码中包含printf("%s", buff_src); 【参考方案1】:

printf("%s", buff_src); 正在打印最后一行。

【讨论】:

【参考方案2】:

在您的while 循环之后,您需要额外调用printf()

while(fgets(buff_src, sizeof(buff_src), src) != NULL)

    fputs(buff_src, stdout); // prints each line

fclose(src);
printf("%s", buff_src); // prints buff_src which still holds the last line

只需删除这个对printf() 的不必要调用,它就会按预期工作。

【讨论】:

【参考方案3】:

fgets() 从文件中逐行读取。来自fgets()的手册页

如果读取了换行符,则将其存储到缓冲区中。

fgets(buff_src, sizeof(buff_src), src) /* read upto New line or EOF from src and store into buff_src */

当循环失败时,无论buff_src 包含使用最后一个printf 语句打印的内容。

【讨论】:

以上是关于从 .txt 文件 C 读取时重复最后一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

本地文件读取(csv,txt)时字符编码问题解决

DELPHI中逐行读取并复制

字节流和字符流

C ++快速排序从txt文件中读取的字符串数组

windows批处理文件/获取一行中的最后一个单词

c语言读取文件然后保存到数组中