鱼C论坛

 找回密码
 立即注册
查看: 1850|回复: 3

[已解决]关于文件的操作中随机读取位置

[复制链接]
发表于 2019-10-18 09:27:08 | 显示全部楼层 |阅读模式

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

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

x

  1.     rewind(fp);
  2.     printf("%ld\n",ftell(fp));//0

  3.     //update the content of ftell.txt with "hello"
  4.     fputs("hello",fp);

  5.     //print the current position of fp
  6.     printf("%ld\n",ftell(fp--));//5
  7.     printf("%ld\n",ftell(fp));//4
  8.     fclose(fp);
复制代码


ftell.txt文件中原来存储的内容是Fishc,我rewind以后,存入hello,
这时候使用ftell(fp),打印得到5,同时fp指针执行fp--,
再打印时不应该是4吗
但是打印结果为0,请问这是为什么呢
最佳答案
2019-10-18 09:56:18
本帖最后由 jackz007 于 2019-10-18 10:01 编辑

       文件指针是个 handle,就是一个句柄,用来代表被读写的文件,在用 fopen() 函数打开文件的时候,由系统分配得到这个指针,文件操作完毕以后,要用 fclose() 函数进行关闭,用户永远不可以自行改变文件指针的数值。可以改变的应该是文件的读写指针位置,而不是文件指针本身,读写指针会随着文件的读写操作而自动改变。所以,下面这一句是错误用法:

  1.     printf("%ld\n",ftell(fp--));//5
复制代码


      我想,你的代码应该写成这样:
  1. #include <stdio.h>

  2. main()
  3. {
  4.         FILE * fp                                    ;
  5.         if((fp = fopen("ftell.txt" , "w")) != NULL) {
  6.                 fputs("I love Fishc\n" , fp)         ;
  7.                 printf("ftell() = %d\n" , ftell(fp)) ;
  8.                 rewind(fp)                           ;
  9.                 printf("ftell() = %d\n" , ftell(fp)) ;
  10.                 fputs("hello\n" , fp)                ;
  11.                 printf("ftell() = %d\n" , ftell(fp)) ;
  12.                 fclose(fp)                           ;
  13.         }
  14. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-18 09:56:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-10-18 10:01 编辑

       文件指针是个 handle,就是一个句柄,用来代表被读写的文件,在用 fopen() 函数打开文件的时候,由系统分配得到这个指针,文件操作完毕以后,要用 fclose() 函数进行关闭,用户永远不可以自行改变文件指针的数值。可以改变的应该是文件的读写指针位置,而不是文件指针本身,读写指针会随着文件的读写操作而自动改变。所以,下面这一句是错误用法:

  1.     printf("%ld\n",ftell(fp--));//5
复制代码


      我想,你的代码应该写成这样:
  1. #include <stdio.h>

  2. main()
  3. {
  4.         FILE * fp                                    ;
  5.         if((fp = fopen("ftell.txt" , "w")) != NULL) {
  6.                 fputs("I love Fishc\n" , fp)         ;
  7.                 printf("ftell() = %d\n" , ftell(fp)) ;
  8.                 rewind(fp)                           ;
  9.                 printf("ftell() = %d\n" , ftell(fp)) ;
  10.                 fputs("hello\n" , fp)                ;
  11.                 printf("ftell() = %d\n" , ftell(fp)) ;
  12.                 fclose(fp)                           ;
  13.         }
  14. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-18 10:53:51 | 显示全部楼层
jackz007 发表于 2019-10-18 09:56
文件指针是个 handle,就是一个句柄,用来代表被读写的文件,在用 fopen() 函数打开文件的时候,由 ...

嗯,你说的意思我明白。
但对于这个随机读取位置还是有疑问,假如我在rewind并重新写入hello之后,想要只修改两个LL为mm,我怎样实现这个“随机”定位?
不使用fp指针,怎样对文件中的某个中间位置的内容进行修改呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-18 11:01:51 | 显示全部楼层
海-啵啵鱼 发表于 2019-10-18 10:53
嗯,你说的意思我明白。
但对于这个随机读取位置还是有疑问,假如我在rewind并重新写入hello之后,想要 ...

        文本文件的修改一般都会改变文件长度,所以,文本文件的修改不适合随机读写方式。

        对文本文件的修改一般会另外创建一个新文件,逐行读取老文件内容,修改过后再保存到新文件。然后删除老文件,重命名新文件。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 18:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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