fgets-省略了c中的最后一行

fgets-省略了c中的最后一行,c,fgets,C,Fgets,基本上,我的代码有问题——这是作业,所以出于明显的原因,我不想在这里发布。如果这样做对我来说真的很重要,那么我将不得不这样做,因为我被卡住了 我正在读取2个文本文件,它还有一个分隔符,这些值来自命令行,假设这个分隔符是xx File a a b c File b d e Output should be axxd bxxe cxx 问题是我的代码没有正确地执行最后一行 我得到的输出是 axxd bxxe 我希望你们可以收集我做错了什么,而不用我发布我所有的代码,但我的逻辑是基于这个原则

基本上,我的代码有问题——这是作业,所以出于明显的原因,我不想在这里发布。如果这样做对我来说真的很重要,那么我将不得不这样做,因为我被卡住了

我正在读取2个文本文件,它还有一个分隔符,这些值来自命令行,假设这个分隔符是xx

File a
a
b
c


File b
d
e

Output should be
axxd
bxxe
cxx
问题是我的代码没有正确地执行最后一行

我得到的输出是

axxd
bxxe
我希望你们可以收集我做错了什么,而不用我发布我所有的代码,但我的逻辑是基于这个原则的

while not at the end of the file for files a and b
    get a line using fgets from a
    create a character pointer and set it to the first occurrence of \n in the line using strchr
    if the pointer isn't null
        set the pointers value to be the end of line

get the line from b as above
and now write the line from a, the separator and the line from b to file

也许你在打印最后一行之后就不打印换行符了?然后它可能根本不会显示在屏幕上。请注意,如果原始行有一个换行符,fgets只会在缓冲区中放置一个换行符,而文件的最后一行可能没有。

打印最后一行后,可能不打印换行符?然后它可能根本不会显示在屏幕上。请注意,如果原始行有换行符,fgets只会在缓冲区中放入换行符,而文件的最后一行可能没有。

这是您的第一个逻辑问题:
while(!feof(a)&&&!feof(b))


这意味着,如果其中一个文件已到达末尾,则即使另一个文件中有更多行,也会停止处理。

这是您的第一个逻辑问题:
while(!feof(a)&&&&!feof(b))



这意味着,如果其中一个文件已到达末尾,则停止处理,即使另一个文件中有更多行。

显示您遇到问题的C代码的最小示例,这是不可能的,因为它只有8行代码:您不愿意发布8行代码吗?使用while()和fgets()是最高安全级别的问题?您似乎已经删除了代码。这是故意的,因为它使这个问题的答案不合逻辑吗?这是因为我想要关于如何解决问题的建议,这是每个人都乐于提供的。问题是,我真的不想在提交时发布代码,因为它“看起来”像是我在作弊,即使我真的只是在征求意见。我想公平地说,我公开承认这是一个家庭作业,但有些人给出了尝试性的完整解决方案,似乎与我的原始代码相似……展示一个你遇到问题的C代码的最小示例是不可能的,因为它只有8行代码:你不愿意发布8行代码吗?使用while()和fgets()是最高安全级别的问题?您似乎已经删除了代码。这是故意的,因为它使这个问题的答案不合逻辑吗?这是因为我想要关于如何解决问题的建议,这是每个人都乐于提供的。问题是,我真的不想在提交时发布代码,因为它“看起来”像是我在作弊,即使我真的只是在征求意见。我想公平地说,我公开承认这是一个家庭作业,但有些人给出了与我的原始代码类似的完整解决方案……谢谢,这让我有了更多的工作,但是第一种方式是你找到了更多:S!!好旧的EOF旗帜。他们应该在文档中写上“永远不要使用此函数来测试您是否可以阅读更多内容”,然后人们可能会远离它。如果您只是更改while条件并保持代码不变,那么您将尝试对可能处于
EOF
的流调用
fgets
。您需要检查
fgets
的返回值,以确保不会将旧的缓冲区内容视为新读取的数据。从逻辑上讲,文件结尾将表明没有其他内容可读取:数据只有在读取失败后才能保证设置EOF标志。这就是为什么
feof
被认为是一种代码气味。在几乎所有情况下,如果测试的特定读取函数的结果是正确的,则代码会更加健壮。在许多使用
feof
的代码实例中,函数没有在代码中的正确点调用,并且通常没有相应的
ferror
检查。谢谢,这给了我一些解决方法,但是第一种方法意味着您找到了更多:S!!好旧的EOF旗帜。他们应该在文档中写上“永远不要使用此函数来测试您是否可以阅读更多内容”,然后人们可能会远离它。如果您只是更改while条件并保持代码不变,那么您将尝试对可能处于
EOF
的流调用
fgets
。您需要检查
fgets
的返回值,以确保不会将旧的缓冲区内容视为新读取的数据。从逻辑上讲,文件结尾将表明没有其他内容可读取:数据只有在读取失败后才能保证设置EOF标志。这就是为什么
feof
被认为是一种代码气味。在几乎所有情况下,如果测试的特定读取函数的结果是正确的,则代码会更加健壮。在许多使用
feof
的代码实例中,函数没有在代码中的正确点调用,并且通常没有相应的
ferror
检查。