明知道这是一场意外 2016-04-11 05:16 采纳率: 66.7%
浏览 1832
已结题

关于利用fgets()改变文件指针位置再利用fprintf()更新文件数据的一些小疑问求教

下面便是一个更新卡信息文件数据的函数updateCard

int updateCard(const char* CardPath,const Card* pcard,int nIndex)
{//更新卡信息文件中的数据,CardPath为文件路径,pcard为指向要更新的卡信息结点的指针,nIndex为卡信息在文件中的索引号(即在卡信息文件中的行数)
    FILE* fp = NULL;
    long lpostion = 0;
    char string[100] = {0};
    char startTime[TIMELENGTH]={0};
    char endTime[TIMELENGTH]={0};
    char lastTime[TIMELENGTH]={0};
    int ncount = 0;
    if((fp = fopen(CardPath,"r+")) == NULL)
        return FALSE;
    while(ncount++<nIndex){
        fgets(string,100,fp);
        printf("%p\n",(int*)fp);
        lpostion = ftell(fp);
    }
    printf("%p\n",(int*)fp);
    //将时间转化为字符串
    timeToString(pcard->tStart,startTime);
    timeToString(pcard->tEnd,endTime);
    timeToString(pcard->tLast,lastTime);
    fseek(fp,lpostion,0);
    printf("%p\n",(int*)fp);
    //向文件中写入数据
    //格式为:卡号##密码##状态##开卡时间##截止时间##累积金额##最后使用时间##使用次数##当前余额##删除标识
    fprintf(fp,"%s##%s##%d##%s##%s##%0.1f##%s##%d##%0.1f##%d\n",pcard->aName,pcard->aPwd,pcard->nStatus,
        startTime,endTime,pcard->fTotalUse,lastTime,pcard->nUseCount,pcard->fBalance,pcard->nDel);
    fclose(fp);
    return TRUE;
}

关于卡信息文件
截图如下,每条卡信息占据一行
图片说明

主要疑问如下:
既然已经利用fgets改变了文件指针位置,如果不利用fseek及ftell函数为何无法更新卡信息文件中的数据?
以下两个截图分别是利用fseek及ftell等函数和不利用的文件中数据截图
(以更改第二行卡号为qq的数据为例,注意##0##到##1##的转变)
1.更新成功!
图片说明

2.更新失败!
图片说明

  • 写回答

1条回答

  • 关注

    求解答啊呜呜呜呜难道又这样沉了么

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)