2010-11-26 4 views
0

У меня вопрос о программировании и файлах.C Программирование - Файл - 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); 

Я не знаю почему, но AINT записывать значение id_doc на двоичный файл под названием «Archivo» ... что может быть проблема? Я добавил Printf из id_doc и значение было printed..I действительно не знаю

Ok, Heres полный код (более-менее):

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 умирает здесь, пожалуйста, помогите:/

+1

Где декларация `id_doc`? – 2010-11-26 05:54:06

+0

это, кажется, неуклюжий способ найти максимальное значение id_doctor из связанного списка ...? – 2010-11-26 06:08:36

+0

Какой режим, как `Archivo` открыл в aka, правильно ли он был открыт для ** двоичного ** письма? – Necrolis 2010-11-26 06:19:14

ответ

2

Попробуйте добавить fflush(Archivo);, чтобы заставить записывать все буферизованные данные.

Кроме того, это утверждение: if(current->Id_Doctor=='\0') действительно должен быть else, так как нет никакой другой вещи это может быть, но '\0'

0

Если ваш первый current является Id_Doctor у вас есть бесконечный цикл.

Если нет current после вашего последнего current, который не является Id_Doctor, вы получаете незаконную деинфекцию указателя.

Для вашей проблемы: попробуйте семью flush().

2

Три вещи:

  • Убедитесь, что ваш Еореп успешно.

    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 или аналогичную) и вместо этого записать строку в выходной файл.

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

Если вы определили id_doc как что-либо иное, кроме символа, он напишет \ 0 в файл.

Гораздо чище будет:

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

Вы передаете указатель на FOUR-BYTE INT, но только писать по одному байту (неправильно байт)!

Решение: объявить id_doc как «char», а не «int».

0

Вы уже написаны строки "\n<md>\n" и "<id_doctor> " в файл Archivo, который, кажется, указывают, что не двоичный файл на всех, а файл XML-стиле.

В этом случае, что вы почти наверняка хотите, это:

fprintf(Archivo, "%d", id_doc); 
Смежные вопросы