如何在二进制*.dat文件中存储或打印信息?C程序设计

如何在二进制*.dat文件中存储或打印信息?C程序设计,c,data-structures,stream,fopen,binaryfiles,C,Data Structures,Stream,Fopen,Binaryfiles,我想在二进制模式下的*.dat文件中存储或读取信息。该文件包含以下数据(以二进制形式编码): 这是我的密码: #include <stdio.h> #include <string.h> #define MAXPLEN 80 typedef struct { char none; /* used for registry initiated by '\0' ,should be ingnored */ char owner[MAXPLEN

我想在二进制模式下的*.dat文件中存储或读取信息。该文件包含以下数据(以二进制形式编码):

这是我的密码:

#include <stdio.h>
#include <string.h>
#define MAXPLEN 80

typedef struct {    
    char none; /* used for registry initiated by '\0' ,should be ingnored */    
    char owner[MAXPLEN];
    char license[6];
    double value;
} veiculo_t;    


/* i need to use the following functions in the process */

void print_registry(veiculo_t *v)
{
    printf("Owner: %s - License: %.6s - Value: %.2lf \n", (*v).owner, (*v).license, (*v).value);
}

void read_registry(veiculo_t *v)
{
    char license2[8];
    printf("Name of the owner:\n");
    fgets((*v).owner,100,stdin);

    printf("License plate:\n");
    fgets(license2,10,stdin);
    memcpy(&(v->license),license2,6);

    printf("Value:\n");
    scanf("%lf",&(*v).value);
}

int op_menu() 
{
    int op;
    printf("\n0 - end\n");
    printf("1 - insert\n");
    printf("2 - print\n");
    printf("option: ");
    scanf("%d",&op);  
    getchar();        
    return op;
}

int main()
{
    int op;
    op_menu();

    if (op=1){
        /* !!!!!HELP HERE!!!!!! */
    }

    if (op=2){
        FILE *f=fopen("veic.dat", "rb");
        if (f == NULL) 
        {
            printf("Not opened!\n");
        }
        else
            /* !!!!!HELP HERE!!!!!! */
    }
}
#包括
#包括
#定义MAXPLEN 80
类型定义结构{
char none;/*用于由“\0”启动的注册表,应为ingnored*/
字符所有者[MAXPLEN];
字符许可证[6];
双重价值;
}静脉;
/*我需要在这个过程中使用以下函数*/
无效打印注册表(veiculo\U t*v)
{
printf(“所有者:%s-许可证:%.6s-值:%.2lf\n”,(*v).Owner,(*v.License,(*v.Value));
}
无效读取注册表(veiculo\U t*v)
{
字符许可证2[8];
printf(“所有者名称:\n”);
fgets((*v).所有者,100,标准DIN);
printf(“车牌号:\n”);
fgets(许可证2,10,标准DIN);
memcpy(&(v->许可证),许可证2,6);
printf(“值:\n”);
扫描频率(“%lf”和(*v).值);
}
int op_菜单()
{
int op;
printf(“\n0-end\n”);
printf(“1-插入\n”);
printf(“2-print\n”);
printf(“选项:”);
scanf(“%d”和&op);
getchar();
返回op;
}
int main()
{
int op;
操作菜单();
如果(op=1){
/*!!!!!救命啊*/
}
如果(op=2){
文件*f=fopen(“veic.dat”、“rb”);
如果(f==NULL)
{
printf(“未打开!\n”);
}
其他的
/*!!!!!救命啊*/
}
}

不太了解“溪流”。。。请给我一些提示

fwrite
fread
可以满足您的需要

下面是一个示例程序,说明了它们的用法:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
   FILE* out = fopen("data.o", "wb");
   int i = atoi(argv[1]);
   fwrite(&i, sizeof(int), 1, out);
   fclose(out);

   FILE* in = fopen("data.o", "rb");
   fread(&i, sizeof(int), 1, in);
   fclose(in);

   printf("Number saved and restored from file: %d\n", i);
}
#包括
#包括
int main(int argc,字符**argv)
{
FILE*out=fopen(“data.o”、“wb”);
int i=atoi(argv[1]);
fwrite&i,sizeof(int),1,out;
fclose(out);
FILE*in=fopen(“data.o”、“rb”);
fread(&i,sizeof(int),1,in);
fclose(in);
printf(“从文件中保存和还原的编号:%d\n”,i);
}
执行程序的结果:

>> ./test-51 2345 Number saved and restored from file: 2345 >> ./test-51 -200 Number saved and restored from file: -200 >>/测试-51 2345 从文件中保存和还原的编号:2345 >>/测试-51-200 从文件中保存和还原的数量:-200 正如您所期望的,输出文件的大小只有4个字节

>> wc data.o 0 1 4 data.o >>wc data.o 0 1 4数据。o
首先,更改下面的选项,否则您将永远无法进入“菜单”

根据注释,您必须调用
read\u registry
方法。新增代码:

    if (op==1){
        //insert
        veiculo_t *t = malloc(sizeof(veiculo_t));
        read_registry(t);
        FILE *f=fopen("veic.dat", "ab");
        if (f == NULL)
        {
            printf("open file failed\n");
        }
        fwrite(t, sizeof(char), sizeof(*t), f);
        free (t);
    }

    if (op==2){
        //print
        FILE *f=fopen("veic.dat", "rb");
        if (f == NULL)
        {
            printf("Not opened!\n");
        }
        else
        {
            veiculo_t *t = malloc(sizeof(veiculo_t));
            printf("sizeof t: %d\n", sizeof(*t));
            while(fread(t, sizeof(char), sizeof(*t), f))
                print_registry(t);
            free(t);
        }
示例代码仅供参考,我想提供一种思考而非答案,但代码似乎总是清晰而强大的。在下面的示例中,我使用附加模式写入文件,如果您希望每次都重新写入文件,请在写入文件时在
fopen
中更改模式


希望对您有所帮助。

您确定该文件是二进制文件吗?我认为它是文本。@BlackMamba它是二进制的,这只是它包含的信息种类的一个例子(以二进制形式编码)提示:如果文件未以文本模式打开和处理,
scanf
可能是您最不想使用的函数。(老实说,这不是您想要使用的函数,即使它是一个文本文件)。类似地,对于
fgets()
,它要求换行符停止解析,除非您的字段与输入缓冲区的长度相同。您可以使用
fread
,这是链接:这可能会有帮助
op = op_menu();    //op should be assigned by the return value of open_menu
if (op==1){...
if (op==2){...    // I believe you want '==' not '='
    if (op==1){
        //insert
        veiculo_t *t = malloc(sizeof(veiculo_t));
        read_registry(t);
        FILE *f=fopen("veic.dat", "ab");
        if (f == NULL)
        {
            printf("open file failed\n");
        }
        fwrite(t, sizeof(char), sizeof(*t), f);
        free (t);
    }

    if (op==2){
        //print
        FILE *f=fopen("veic.dat", "rb");
        if (f == NULL)
        {
            printf("Not opened!\n");
        }
        else
        {
            veiculo_t *t = malloc(sizeof(veiculo_t));
            printf("sizeof t: %d\n", sizeof(*t));
            while(fread(t, sizeof(char), sizeof(*t), f))
                print_registry(t);
            free(t);
        }