2 void cpp1 void_cpp1 于 2016.04.11 13:16 提问

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

下面便是一个更新卡信息文件数据的函数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.更新失败!
图片说明

2个回答

CSDNXIAOD
CSDNXIAOD   2016.04.11 13:23

fread返回0或者不是期望的值,那么是否会读取到数据(如果数据没有读完的话),并改变了文件的指针位置?
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

void_cpp1
void_cpp1   2016.04.13 10:20

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
文件的操作2-----读写文件/移动文件读写指针位置/重回文件头部、fprintf()函数、freopen函数
1、读文件函数 2、写文件函数
fgets:从文件结构体指针stream中每次读取一行数据
fgets: 从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调
C语言文件指针的基本函数介绍包含了fpoen、fclose、fgetc、fputc、fscanf、fprintf、fgets、fputs、fread、fwrite函数以及文件定位函数.
一、打开关闭文件 只打开文件   再关闭文件 #include #include main() { FILE *fp; fp = fopen("data.dat","r"); //打开文件 if(fp == NULL) { printf("Cannot open this file!\n "); exit(0); //头文件需要有 stdlib.h
c文件操作之位置指针设置函数fseek
fseek 原型:int fseek(FILE *stream, long offset, int fromwhere); 功能:重定位流(数据流/文件)上的文件内部位置指针 注意:不是定位文件指针(文件指针是 FILE * fp 这样的),文件指针指向文件/流。位置指针指向文件内部的字节位置,随着文件的读取会移动,文件指针如果不重新赋值将不会改变指向别的文件。   函数设置文件指针st
C语言文件读写例题,fgetc,fputc,fgets,fputs,fread,fwrite,fscanf,fprintf
int main() { FILE *fp; char ch; char str[1024],st[11];//str[]用来读取文件中的内容,st[]用来输入内容到文件 fp=fopen("dest.txt","w+"); //fgetc与fputc使用 printf("fputc输入文件,请输入:"); ch=getchar(); while(ch!='\n') {
FILE文件流的中对fopen、fseek、fread、fwrite,fprintf、fputs、fgets的理解
目前课题中使用,记录下来方便以后查看。 fopen    fopen函数用来打开一个文件,其调用的一般形式为:    FILE * fopen(const char * path,const char * mode); fopen()函数中第一个形式参数表示文件名, 可以包含路径和文件名两部分。如: "B:TEST.DAT" "C://TC//TES
fgets fprintf fscanf fputs fgetc fputc的区别你懂了吗
fgets(由文件中读取一字符串) 表头文件: #include 定义函数: char * fgets(char * s,int size,FILE * stream); 函数说明: fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。 返回值:   fgets(
文件指针位置操作
SYNOPSIS        #include        int fseek(FILE *stream, long offset, int whence);        long ftell(FILE *stream);        void rewind(FILE *stream);        int fgetpos(FILE *stream, fpos_t *po
函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结
字符串读写函数fgets和fputs:
fread fwrite之后文件指针位置
在调用fread fwrite之后,文件指针,会根据读写的长度,相应的往后偏移: #include #include #include int main() { char *tmp = "hhhh"; FILE *p = fopen("aa.txt", "r+"); char *buf = (char *)malloc(128); fread(buf, 1