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);
我不知道为什么,但它不是在名为’Archivo’的二进制文件上写id_doc的值…可能是什么问题? 我添加了一个id_doc的printf,并打印了值。我真的不知道
好的,inheritance人的完整代码(更多):
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\n"; const char *id_doc1=" "; 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); }
我死在这里,请帮忙:/
尝试添加fflush(Archivo);
强制写入所有缓冲数据。
此外,这句话: if(current->Id_Doctor=='\0')
真的应该是else
因为除了'\0'
没有别的东西可以
三件事:
-
确保你的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或类似字符串)并将字符串写入输出文件。
fwrite(&id_doc, sizeof(char), 1, Archivo);
如果您将id_doc定义为除char之外的任何内容,则会将\ 0写入该文件。
更清洁的将是:
fwrite(&id_doc, sizeof(id_doc), 1, Archivo);
如果您的第一个current
是Id_Doctor
那么您将拥有无限循环。
如果在您的最后一个current
不是Id_Doctor
之后没有current
,则会得到非法指针derefenciation。
对于您的问题:尝试flush()系列。
你传递一个指向四字节INT的指针,但只写一个字节( 错误的字节)!
解决方案:将id_doc声明为“char”,而不是“int”。
您之前已将字符串"\n
和"
写入文件Archivo
,这似乎表明它根本不是二进制文件,而是XML样式的文件。
在这种情况下,你几乎肯定想要的是:
fprintf(Archivo, "%d", id_doc);