二进制文件读/写C语言
所以我有一个input.bin文件,其中包含以下内容
IK-SZH;jdl72u;John Doe;2013-03-28 11:05 IK-GRR;kat91n;Jane Doe;2013-03-21 15:41 IK-GRR;oat62f;Jane Doe;2013-03-24 08:08 我正在做的是将其读入结构.用数据做一些事情.添加/删除行. 但不是像上面那样出现.就像这样(没有空格): IK-SZH NUL jdl72u NUL John Doe NUL NUL NUL NUL NUL 2013-03-28 NUL NUL NUL IK-GRR NUL kat91n NUL Jane Doe NUL NUL NUL NUL ... 当我重新读取文件(使用NUL)时,它只将第1行放入结构中 我的代码 typedef struct foo { char kid[7]; char jid[7]; char name[21]; char time[20]; } Foo; Foo foo[200]; FILE* fp; int size; ——-文件阅读器 void read(char* filename){ fp = fopen(filename,"rb"); int i = 0; while (!feof(fp)) { if (fp==NULL){perror("File opening errorn"); exit(1);} fscanf(fp,"%[^;]; %[^;]; %20[^;]; %sn",foo[i].kid,foo[i].jid,foo[i].name,foo[i].time); i++; } size = i; print(); fclose(fp); } void print(){ int i; for (i = 0; i < size; ++i){ printf("%st %st %st %sn",foo[i].time); } } —–作家 void write(){ char str[1000]; FILE* f = fopen("input.bin","wb"); fseek(f,SEEK_SET); int i; for (i = 0; i < jel_size; i++) fwrite(&foo[i],sizeof(struct foo),1,f); fclose(f); } 试过这个,但这没有写任何文件: char str[1000]; sprintf(str,"%s;%s;%s;%sn",jelent[i].kazon,jelent[i].jazon,jelent[i].nev,jelent[i].ido ); write(f,&str,sizeof(str))!=sizeof(str); 解决方法
您的结构定义是:
typedef struct foo { char kid[7]; char jid[7]; char name[21]; char time[20]; } Foo; 将结构写入文件的代码在write()中: for (i = 0; i < jel_size; i++) fwrite(&foo[i],f); 如果结构初始化为所有字节为零,那么对于您提到的第一行数据: IK-SZH;jdl72u;John Doe;2013-03-28 11:05 我们可以推断该结构包含: IK-SZH jdl72u John Doe 2013-03-28 11:05 或多或少与你说的文件包含的内容一致: IK-SZH NUL jdl72u NUL John Doe NUL NUL NUL NUL NUL 2013-03-28 NUL NUL NUL 根据我的估算,你在名字和时间之后缺少一些NUL,并且在日期之后缺少一个NUL. 如果想要文本输出,则必须使用fprintf()格式化write()中的数据,类似于read()函数中的fscanf()语句.您应该从函数返回一个状态以指示它是否成功.你也可以争论检查fclose()是否成功. void write(void) { FILE *fp = fopen("input.bin","w"); if (fp != 0) { for (int i = 0; i < jel_size; i++) fprintf(fp,foo[i].time); fclose(fp); } } 如果需要二进制输出,则应在read()中使用二进制输入.同样,你应该考虑返回成功或失败的迹象;避免全局变量也很好. void read(const char *filename) { FILE *fp = fopen(filename,"rb"); if (fp != 0) { for (i = 0; fread(&foo[i],sizeof(foo[i]),fp) == 1; i++) ; fclose(fp); size = i; } } 这两种技术都可行;试图在输出上使用一个而在输入上使用另一个会导致混乱和混乱. 请注意,函数read()和write()由具有不同接口的POSIX使用.虽然您坚持使用标准C,但您可以使用这些名称,但使用其他名称(例如reader()和writer()或foo_read()和foo_write())可能会更好. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |