c/c++语言开发共享二进制文件读/写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 

我正在做的是把它读成一个结构。 用数据做一些事情。 添加/删除行。 然后我想以与上面相同的格式将结构的内容写回input.bin文件。

但不是像上面那样出现。 就像这样(没有空格):

 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].kid, foo[i].jid, foo[i].name, foo[i].time); } } 

—–作家

 void write(){ char str[1000]; FILE* f = fopen("input.bin", "wb"); fseek(f, 0, 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], sizeof(struct foo), 1, 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, "%s;%s;%s;%sn", foo[i].kid, foo[i].jid, foo[i].name, 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]), 1, fp) == 1; i++) ; fclose(fp); size = i; } } 

    这两种技术都可行; 试图在输出上使用一个而在输入上使用另一个会导致混乱和混乱。

    请注意,函数read()write()由具有不同接口的POSIX使用。 虽然您坚持使用标准C,但您可以使用这些名称,但使用其他名称(例如reader()writer()foo_read()foo_write()可能会更好。

    改变了一些代码,评论并进行了测试,所以它确实有效。

    需要了解更多c/c++开发分享二进制文件读/写C语言,也可以关注C/ C++技术分享栏目---计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享二进制文件读/写C语言相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979293.html

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐