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

最初currentが のId_Doctor場合、無限ループがあります。

current最後の後に ではない no がない場合currentId_Doctor不正なポインターの非参照が発生します。

問題の場合: flush() ファミリーを試してください。

于 2010-11-26T06:00:59.237 に答える
0

以前に文字列"\n<md>\n""<id_doctor> "を fileに書き込んだことがありますが、これはバイナリ ファイルではなく、XML スタイルのファイルでArchivoあることを示しているようです。

この場合、ほぼ確実に必要なのは次のとおりです。

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

FOUR-BYTE INT へのポインターを渡していますが、1 BYTE (間違ったバイト) しか書き込んでいません!

解決策: id_doc を「int」ではなく「char」として宣言します。

于 2010-11-26T08:23:07.537 に答える