m0_51507696 2021-09-04 14:36 采纳率: 100%
浏览 19
已结题

请问,为什么我不能用将文件跳过某段数据读取到缓冲区后删除文件再创建一个同路径同名文件后将缓冲区的数据写入到该文件的方法来删除文件中的指定段落


void delete_file_paragraphs(char* path,long head_offset,long trail_offset){
    FILE* fp=fopen(path,"rb+");//打开被操作文件
    /*先以长度不清零的方式打开被操作文件,用从头顺序读取的方式跳过要删除的区间,将读取到的数据存入缓存,删除被操作文件,以从头写入并创建文件的方式打开之前被操作文件的路径,将缓存数据写入文件,释放缓存*/
    if(fp!=NULL){
        fseek(fp,0,SEEK_END);//被操作文件偏移到文件尾
        long file_trail=ftell(fp);//保存了被操作文件尾的偏移量,和文件长度
        char* BUF_=(char*)malloc(sizeof(char)*(file_trail-head_offset));//建立缓存区用来保存文件数据
        long count=0;//计数变量
        long offset_CUR=0;//用于保存文件当前偏移量
        for(fseek(fp,0,SEEK_SET);file_trail!=offset_CUR;count++){
            if(offset_CUR==head_offset){
                fseek(fp,(trail_offset-head_offset),SEEK_CUR);
            }//跳过区间
            fscanf(fp,"%c",BUF_+count);//将从文件获取到的数据存入缓冲区
            offset_CUR=ftell(fp);//获取当前偏移量
        }//将文件指定内容写入缓存
        fclose(fp);//关闭文件
        remove(path);//删除文件
        fp=fopen(path,"w");//创建并打开文件
        //fp=fopen("C:\\Users\\user\\Desktop\\新建文本文档30.txt","w");
        for(count=0;count<file_trail-4;count++){
            fprintf(fp,"%c",*(BUF_+count));//从缓存向文件写入数据
            printf("%c",*(BUF_+count));
        }//将缓存数据写入文件
        free(BUF_);//释放缓存
        fclose(fp);//关闭文件
    }
}//根据段首和段尾的偏移量删除文件中的任意段落。形参1为被操作文件的路径,形参2为段落首部偏移量,形参3为段落尾部偏移量

/附上如上代码/

现象是执行前和执行后的文件内容没有变化,但是将第20和第21行改成——

//fp=fopen(path,"w");//创建并打开文件

fp=fopen("C:\Users\user\Desktop\新建文本文档30.txt","w");

——这样后,新建文本文档30.txt中的内容是正确的

  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-09-04 16:49
    关注

    那应该检查一下你传递的path到底是什么值了啊

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月12日
  • 已采纳回答 9月4日
  • 修改了问题 9月4日
  • 创建了问题 9月4日

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试