2010-11-26 32 views
0

J'ai une question concernant la programmation et les fichiers.C Programmation - Fichier - fwrite

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); 

Je ne sais pas pourquoi mais il aint écrit la valeur de id_doc sur le fichier binaire appelé « Archivo » ... ce qui pourrait être le problème? J'ai ajouté un printf de id_doc et la valeur a été printed..I ne sais vraiment pas

Ok, voici le code complet (plus-moins):

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); 
} 

Im mourir ici, s'il vous plaît aider:/

+1

Où est la déclaration de 'id_doc'? –

+0

cela semble être une manière maladroite de trouver la valeur id_doctor maximale d'une liste liée ...? –

+0

quel mode comme 'Archivo' ouvert dans aka était-il correctement ouvert pour ** écriture binaire **? – Necrolis

Répondre

2

Essayez d'ajouter fflush(Archivo); pour forcer l'écriture de toutes les données mises en mémoire tampon.

En outre, cette déclaration: if(current->Id_Doctor=='\0') devrait vraiment être un else car il n'y a pas d'autre chose, il ne peut être que '\0'

+0

la chose est que dans Archivo nous avons des données écrites que nous ne pouvons pas effacer. Par exemple, nous avons: ** le "**" signifie l'endroit où nous voulons mettre le id_doc – Jujitsu

+0

Nous avons essayé cela aussi et n'a pas fonctionné non plus; et oui nous l'avons changé pour autre, idk qu'est-ce que c'était à propos de haha ​​ – Jujitsu

+0

Un fflush serait inutile étant donné que l'appel fclose est atteint et réussi (et aucun freads n'est effectué sur Archivo entre les frwites). –

0

Si votre premier current est un Id_Doctor vous avez une boucle sans fin.

S'il n'y a pas current après votre dernier current qui n'est pas un Id_Doctor, vous obtenez une déréfenciation de pointeur illégale. Pour votre problème: essayez la famille flush().

+0

c'est notre programme: – Jujitsu

2

Trois choses:

  • Assurez-vous que votre fopen est réussie.

    Archivo=fopen("md.dat", "ab+"); 
    if (Archivo == NULL) 
    { 
        perror("Failed to open file Archivo"); 
        ... 
    } 
    
  • Assurez-vous de vérifier le succès de vos modifications.

    if (fwrite(&id_doc, sizeof(id_doc), 1, Archivo) < 1)  
    {  
        perror("Failed to write to file Archivo"); 
        ... 
    } 
    
  • Assurez-vous d'avoir un fclose pour fermer le fichier correctement.

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

Maintenant que vous avez un poste échantillon complet de votre code, je suppose que je devrais demander si le contrôle d'erreur est juste à gauche pour la brièveté? Si non, vous devriez penser à l'ajouter.

Si vous attendez que la valeur de id_doc soit au format d'affichage dans le fichier de sortie, vous devrez convertir l'int en une chaîne (en utilisant snprintf ou similaire) et écrire la chaîne dans le fichier de sortie à la place.

1
fwrite(&id_doc, sizeof(char), 1, Archivo); 

Si vous avez défini id_doc comme autre chose qu'un caractère, il écrira \ 0 dans le fichier.

propre Beaucoup serait:

fwrite(&id_doc, sizeof(id_doc), 1, Archivo); 
+0

Nous venons d'essayer cela et n'a pas fonctionné; :( – Jujitsu

0

vous passez un pointeur sur une INT QUATRE BYTE, mais seulement écrire un octet (l'octet mauvais )!

Solution: déclarez id_doc comme "char", pas "int".

0

Vous avez déjà écrit les chaînes "\n<md>\n" et "<id_doctor> " au fichier Archivo, ce qui semble indiquer qu'il est pas un fichier binaire du tout, mais plutôt un fichier de type XML.

Dans ce cas, ce que vous voulez certainement est:

fprintf(Archivo, "%d", id_doc);