鱼C论坛

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

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

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

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

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

x
    rewind(fp);
    printf("%ld\n",ftell(fp));//0

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

    //print the current position of fp
    printf("%ld\n",ftell(fp--));//5
    printf("%ld\n",ftell(fp));//4
    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() 函数进行关闭,用户永远不可以自行改变文件指针的数值。可以改变的应该是文件的读写指针位置,而不是文件指针本身,读写指针会随着文件的读写操作而自动改变。所以,下面这一句是错误用法:
    printf("%ld\n",ftell(fp--));//5

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

main()
{
        FILE * fp                                    ;
        if((fp = fopen("ftell.txt" , "w")) != NULL) {
                fputs("I love Fishc\n" , fp)         ;
                printf("ftell() = %d\n" , ftell(fp)) ;
                rewind(fp)                           ;
                printf("ftell() = %d\n" , ftell(fp)) ;
                fputs("hello\n" , fp)                ;
                printf("ftell() = %d\n" , ftell(fp)) ;
                fclose(fp)                           ;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

main()
{
        FILE * fp                                    ;
        if((fp = fopen("ftell.txt" , "w")) != NULL) {
                fputs("I love Fishc\n" , fp)         ;
                printf("ftell() = %d\n" , ftell(fp)) ;
                rewind(fp)                           ;
                printf("ftell() = %d\n" , ftell(fp)) ;
                fputs("hello\n" , fp)                ;
                printf("ftell() = %d\n" , ftell(fp)) ;
                fclose(fp)                           ;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

        对文本文件的修改一般会另外创建一个新文件,逐行读取老文件内容,修改过后再保存到新文件。然后删除老文件,重命名新文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-4 15:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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