海-啵啵鱼 发表于 2019-10-18 09:27:08

关于文件的操作中随机读取位置


    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,请问这是为什么呢

jackz007 发表于 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)                           ;
      }
}

海-啵啵鱼 发表于 2019-10-18 10:53:51

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

嗯,你说的意思我明白。
但对于这个随机读取位置还是有疑问,假如我在rewind并重新写入hello之后,想要只修改两个LL为mm,我怎样实现这个“随机”定位?
不使用fp指针,怎样对文件中的某个中间位置的内容进行修改呢?

jackz007 发表于 2019-10-18 11:01:51

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

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

      对文本文件的修改一般会另外创建一个新文件,逐行读取老文件内容,修改过后再保存到新文件。然后删除老文件,重命名新文件。
页: [1]
查看完整版本: 关于文件的操作中随机读取位置