鱼C论坛

 找回密码
 立即注册
查看: 1944|回复: 1

[已解决]求指点,关于fseek()在文件结尾处莫名出现一个换行符

[复制链接]
发表于 2023-4-4 18:44:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下。其中fopen打开的文件中只有一串数字1234567890。



  1. 1 #include <stdio.h>
  2.   2 #include <stdlib.h>
  3.   3                                                                                                                                            
  4.   4 int main(void)
  5.   5 {   
  6.   6     char ch;
  7.   7     FILE * fp;
  8.   8     
  9.   9     fp = fopen("num", "rb");
  10. 10     fseek(fp, -1L, SEEK_END);
  11. 11     ch = getc(fp);
  12. 12     fclose(fp);
  13. 13     if ('\n' == ch)
  14. 14         puts("aaa");
  15. 15     else
  16. 16         putchar(ch);
  17. 17
复制代码
运行结果为:


  1. [root@localhost test13]# ./a.out
  2. aaa
  3. [root@localhost test13]#
复制代码
这个换行符哪来的呢?



最佳答案
2023-4-4 18:46:58
首先,确认一下 "num" 文件是否以换行符结束。有时编辑器会在文件结尾自动添加换行符。

你可以尝试以下方法来查看 "num" 文件的内容:

  1. cat -A num
复制代码


这个命令会显示文件中的所有字符,包括换行符。如果文件的结尾是一个换行符(通常显示为 $ 符号),那么你的代码的输出就是正确的。

另外,在使用 fseek() 函数时,建议检查其返回值是否为 0,以确保定位操作成功。

以下是你的代码的一个修改版本,加入了错误检查:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5.     char ch;
  6.     FILE *fp;

  7.     fp = fopen("num", "rb");
  8.     if (!fp)
  9.     {
  10.         perror("Error opening file");
  11.         exit(EXIT_FAILURE);
  12.     }

  13.     if (fseek(fp, -1L, SEEK_END) != 0)
  14.     {
  15.         perror("Error seeking in file");
  16.         fclose(fp);
  17.         exit(EXIT_FAILURE);
  18.     }

  19.     ch = getc(fp);
  20.     fclose(fp);

  21.     if ('\n' == ch)
  22.         puts("aaa");
  23.     else
  24.         putchar(ch);

  25.     return 0;
  26. }
复制代码


这个修改后的代码会检查 fopen() 和 fseek() 的返回值,并在遇到错误时输出错误信息。如果问题仍然存在,可以进一步检查文件的内容和格式。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-4 18:46:58 | 显示全部楼层    本楼为最佳答案   
首先,确认一下 "num" 文件是否以换行符结束。有时编辑器会在文件结尾自动添加换行符。

你可以尝试以下方法来查看 "num" 文件的内容:

  1. cat -A num
复制代码


这个命令会显示文件中的所有字符,包括换行符。如果文件的结尾是一个换行符(通常显示为 $ 符号),那么你的代码的输出就是正确的。

另外,在使用 fseek() 函数时,建议检查其返回值是否为 0,以确保定位操作成功。

以下是你的代码的一个修改版本,加入了错误检查:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5.     char ch;
  6.     FILE *fp;

  7.     fp = fopen("num", "rb");
  8.     if (!fp)
  9.     {
  10.         perror("Error opening file");
  11.         exit(EXIT_FAILURE);
  12.     }

  13.     if (fseek(fp, -1L, SEEK_END) != 0)
  14.     {
  15.         perror("Error seeking in file");
  16.         fclose(fp);
  17.         exit(EXIT_FAILURE);
  18.     }

  19.     ch = getc(fp);
  20.     fclose(fp);

  21.     if ('\n' == ch)
  22.         puts("aaa");
  23.     else
  24.         putchar(ch);

  25.     return 0;
  26. }
复制代码


这个修改后的代码会检查 fopen() 和 fseek() 的返回值,并在遇到错误时输出错误信息。如果问题仍然存在,可以进一步检查文件的内容和格式。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 15:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表