0

我有一个关于编程和文件的问题。

while(current!=NULL)
{
  if(current->Id_Doctor!='\0')
  {
    current=current->next;
    id_doc=(current->Id_Doctor);
  }
  if(current->Id_Doctor=='\0')
  {
    id_doc=id_doc+1;
    printf("%d", id_doc);
    break;
  }
}
fwrite(&id_doc, sizeof(char), 1, Archivo);

我不知道为什么,但它没有在名为“Archivo”的二进制文件上写入 id_doc 的值......可能是什么问题?我添加了一个 id_doc 的 printf 并打印了值..我真的不知道

好的,这是完整的代码(更多-更少):

struct Medico
{
  int Id_Doctor;
  int Estado;
  char Nombre[60];
  char Clave_Acceso[20];
  char Especialidad[40]; 
  struct Medico *next;
};
void Dar_Alta_Med (int estado);
void MenuPrincipal(char enta);
int main(void)
{
  char enta;
  MenuPrincipal(enta);
}
void Dar_Alta_Med(int estado)
{
  struct Medico * head = NULL;
  struct Medico * prev, *current;
  char nombre_doc[60], especialida[40], password[20];
  int id_doc=0, estado_doc=1;
  FILE *Archivo;
 const char *md1="\n<md>\n";
  const char *id_doc1="<id_doctor> ";
 Archivo=fopen("md.dat", "ab+");
  fwrite(md1, 1, strlen(md1), Archivo);
  fwrite(id_doc1, 1, strlen(id_doc1), Archivo);
  current = (struct Medico *) malloc (sizeof(struct Medico));
  current->Id_Doctor=id_doc; 
  while(current!=NULL)
    {
      if(current->Id_Doctor!='\0')
    {
      current=current->next;
      id_doc=(current->Id_Doctor);
    }
      else
    {
      id_doc=id_doc+1;
      printf("%d", id_doc);
      break;
    }
    }
  fwrite(&id_doc, sizeof(id_doc), 1, Archivo);
  printf("Ingresa el nombre del Doctor a dar de alta: ");
  fclose(Archivo);
}

我死在这里,请帮助:/

4

6 回答 6

2

尝试添加fflush(Archivo);以强制写入所有缓冲数据。

此外,这句话:if(current->Id_Doctor=='\0')真的应该是一个,else因为除了'\0'

于 2010-11-26T05:53:51.020 回答
2

三件事:

  • 确保您的 fopen 成功。

    Archivo=fopen("md.dat", "ab+");
    if (Archivo == NULL)
    {
         perror("Failed to open file Archivo");
         ...
    }
    
  • 确保您正在检查您的 fwrite 是否成功。

    if (fwrite(&id_doc, sizeof(id_doc), 1, Archivo) < 1)    
    {    
         perror("Failed to write to file Archivo");
         ... 
    }
    
  • 确保你有一个 fclose 来正确关闭文件。

    if (fclose(Archivo) != 0)    
    {    
        perror("Failed to close file Archivo");     
        ...
    }
    

既然您已经发布了完整的代码示例,我想我应该问一下是否为了简洁而忽略了错误检查?如果没有,您应该考虑添加它。

如果您希望 id_doc 的值在输出文件中以显示格式显示,则必须将 int 转换为字符串(使用 snprintf 或类似方法)并将字符串写入输出文件。

于 2010-11-26T06:05:33.137 回答
1
fwrite(&id_doc, sizeof(char), 1, Archivo); 

如果您将 id_doc 定义为 char 以外的任何内容,它会将 \0 写入文件。

更清洁的是:

fwrite(&id_doc, sizeof(id_doc), 1, Archivo); 
于 2010-11-26T06:29:04.850 回答
0

您正在传递一个指向四字节整数的指针,但只写入一个字节(错误的字节)!

解决方案:将 id_doc 声明为“char”,而不是“int”。

于 2010-11-26T08:23:07.537 回答
0

您之前已将字符串"\n<md>\n"和写入"<id_doctor> "文件Archivo,这似乎表明它根本不是二进制文件,而是 XML 样式的文件。

在这种情况下,您几乎可以肯定想要的是:

fprintf(Archivo, "%d", id_doc);
于 2010-11-27T07:51:09.500 回答
0

如果你的第一个currentId_Doctor你有一个无限循环。

如果current你最后一个current不是Id_Doctor,你会得到一个非法的指针取消引用。

对于您的问题:尝试使用 flush() 系列。

于 2010-11-26T06:00:59.237 回答