VZK*_*iss 3 c binary struct file
所以我有一个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
Run Code Online (Sandbox Code Playgroud)
我正在做的是将其读入结构.用数据做一些事情.添加/删除行.然后我想以与上面相同的格式将结构的内容写回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 ...
Run Code Online (Sandbox Code Playgroud)
当我重新读取文件(使用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;
Run Code Online (Sandbox Code Playgroud)
-------文件阅读器
void read(char* filename){
fp = fopen(filename, "rb");
int i = 0;
while (!feof(fp)) {
if (fp==NULL){perror("File opening error\n"); exit(1);}
fscanf(fp,"%[^;]; %[^;]; %20[^\;]; %s\n", 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("%s\t %s\t %s\t %s\n", foo[i].kid, foo[i].jid,
foo[i].name, foo[i].time);
}
}
Run Code Online (Sandbox Code Playgroud)
-----作家
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);
}
Run Code Online (Sandbox Code Playgroud)
试过这个,但这没有写任何文件:
char str[1000];
sprintf(str,"%s;%s;%s;%s\n", jelent[i].kazon,
jelent[i].jazon,jelent[i].nev, jelent[i].ido );
write(f,&str,sizeof(str))!=sizeof(str);
Run Code Online (Sandbox Code Playgroud)
您的结构定义是:
typedef struct foo
{
char kid[7];
char jid[7];
char name[21];
char time[20];
} Foo;
Run Code Online (Sandbox Code Playgroud)
将结构写入文件的代码位于write():
for (i = 0; i < jel_size; i++)
fwrite(&foo[i], sizeof(struct foo), 1, f);
Run Code Online (Sandbox Code Playgroud)
如果结构初始化为所有字节为零,那么对于您提到的第一行数据:
IK-SZH;jdl72u;John Doe;2013-03-28 11:05
Run Code Online (Sandbox Code Playgroud)
我们可以推断该结构包含:
IK-SZH\0
jdl72u\0
John Doe\0\0\0\0\0\0\0\0\0\0\0\0\0
2013-03-28 11:05\0\0\0\0
Run Code Online (Sandbox Code Playgroud)
或多或少与你说的文件包含的内容一致:
IK-SZH NUL jdl72u NUL John Doe NUL NUL NUL NUL NUL 2013-03-28 NUL NUL NUL
Run Code Online (Sandbox Code Playgroud)
根据我的估算,你在名字和时间之后缺少一些NUL,并且在日期之后缺少一个NUL.
如果需要文本输出,则必须write()使用fprintf()类似于函数中的fscanf()语句来格式化数据read().您应该从函数返回一个状态以指示它是否成功.你也可以争论检查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;%s\n", foo[i].kid, foo[i].jid, foo[i].name, foo[i].time);
fclose(fp);
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想要二进制输出,你应该使用二进制输入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;
}
}
Run Code Online (Sandbox Code Playgroud)
这两种技术都可行; 试图在输出上使用一个而在输入上使用另一个会导致混乱和混乱.
请注意POSIX使用的函数read()和write()不同的接口.当你坚持使用标准的C,名字是公平供您使用,但您可能会与其他名称,如更好reader()和writer()或foo_read()和foo_write().