【问题标题】:C program failing to insert to file contents the previously read contentsC 程序未能将先前读取的内容插入文件内容
【发布时间】:2020-07-09 00:40:39
【问题描述】:

当我开始重新插入文件内容并保存新文件时,我的 c 程序出现了这个问题。它在 while 循环中失败,如果我要从中重新插入一些内容,我不明白为什么会这样。

这是我的代码: '''

void init(){
    char pn[30],pd[30],pp[30];
    if ((flptr = fopen("MASTER.dat","r+")) == NULL) { 
        printf("Couldnt Get Cred");
        return;
    }
    fscanf(flptr,"%s %s %s",pn,pd,pp);


    while(!feof(flptr)){
        r = (struct Records *) malloc(sizeof(struct Records));
        int fr = fscanf(flptr,"%s %s %f",r->PartNum,r->PartDesc, &r->PartPrice);
        if(fr == EOF){
            printf("HERE");
            break;
        }

        if(head == NULL){
           head = r;
         }
         else{
             tail->next = r;
         }
         tail = r;
         }

         fclose(flptr);
    }


void put(){
    if ((flptr = fopen("MASTER.dat","r")) == NULL) { 
        printf("Couldnt Get Cred");
        return;
    }

    r = head;
    fprintf(flptr,"PartNumber PartDescription PartPrice\n");

    while (r != NULL){
        fprintf(flptr,"%s %s %f\n", r->PartNum, r->PartDesc, r->PartPrice);
        r = r->next;
    }

    fprintf(flptr,"Changes SAVED.");
    fclose(flptr);
}

【问题讨论】:

  • “失败”是什么意思?

标签: c file linked-list


【解决方案1】:

put 函数中,您打开文件是为了读取它,而不是为了写入,所以您的 fprintf 将不起作用,甚至不会创建文件

if ((flptr = fopen("MASTER.dat","r")) == NULL) { 

必须是

if ((flptr = fopen("MASTER.dat","w")) == NULL) { 

如果稍后您尝试使用 init 读取该不存在的文件,您将不会成功

除了 putinit 使用全局变量 r 并对其进行修改,我鼓励您使用局部变量以避免可能问题


为什么你在init中打开文件文件时只使用“r+”?


当您通过 (f)scanf 读取字符串时,我鼓励您限制长度以不以未定义的行为写出接收器,并始终检查结果,例如替换

fscanf(flptr,"%s %s %s",pn,pd,pp);

通过

if (fscanf(flptr,"%29s %29s %29s",pn,pd,pp) != 3) {
  printf("invalid file contain\n");
  return;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 2013-04-08
    • 2015-06-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多