C:从二进制文件中读取字符串

时间:2013-05-18 16:54:58

标签: c string file binary fread

我有一个家庭作业,说我必须在二进制文件中存储有关大厦的信息。在该文件的第一行,我必须保留有关建筑物中有多少楼层以及楼层有多少公寓(二维阵列大小)的信息。在下一行我必须保留有关公寓的信息 - 每间公寓的唯一编号,公寓内的房间数量,居住在那里的人数,姓氏,家庭搬进公寓的日期,月租金。 / p>

所以,问题是:我应该如何存储这些信息以及我该如何阅读?如果我使用fread(buf,size,number_of_elements,FIlE *),我怎么知道元素的数量? 例如,当我不知道它的长度时,如何阅读姓氏?

提前致谢!

PS。谢谢你,哗众取宠!我试着先将数据写入二进制文件,但我收到了一些错误:(

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

#define NAPARTMENTS 21
#define TAX_ADULT 3
#define TAX_KID 1
#define TAX_ELEVATOR 2
#define NFLOORS 7
#define NROOMS 3

void main()
{
    FILE *fp;
    int i, j;

    struct info_apartments
    {
        unsigned numApartment, numRooms, numAdults, numKids, rent;
        char family[30], date[10];
    };
    typedef struct info_apartments data;

    data apartments[7][3];

    for(i=0; i<NFLOORS; i++)
        for(j=0; j<NROOMS; j++)
        {
            apartments[i][j].numApartment=i*10+j+1;
            printf("\nEnter the number of the rooms: ");
            scanf("%d", apartments[i][j].numRooms);
            printf("\nEnter number of adults: ");
            scanf("%d", apartments[i][j].numAdults);
            printf("\nEnter number of kids: ");
            scanf("%d", apartments[i][j].numKids);
            printf("\nEnter family name: ");
            scanf("%s", apartments[i][j].family);
            printf("\nEnter date: ");
            scanf("%s", apartments[i][j].date);
            //first two floors don't pay for elevator
            if(i+1<3)
                apartments[i][j].rent=(TAX_ADULT*apartments[i][j].numAdults)+(TAX_KID*apartments[i][j].numKids);
            else
                apartments[i][j].rent=((TAX_ADULT+TAX_ELEVATOR)*apartments[i][j].numAdults)+((TAX_KID+TAX_ELEVATOR)*apartments[i][j].rent);
        }
    if((fp=fopen("myfile", "ab"))==NULL)
    {
        printf("Error");
        exit(1);
    }

    if((fwrite(apartments, sizeof(apartments), 1, fp))!=1)
    {
        printf("Error!\n");
        exit(1);
    }
}

2 个答案:

答案 0 :(得分:1)

首先,我想你需要将最后的“if”行更改为:

 if((fwrite(&apartments, sizeof(apartments), 1, fp))!=1)

你忘了把&amp; ..

第二......如果你愿意的话 从文件中读取你用fread函数做同样的事情

 fread(&apartments, sizeof(apartments), 1, fp);

您可以打印它以便查看数据..

 printf("%s",apartments[i][j].family);

OR

 puts(apartments[i][j].family);

答案 1 :(得分:0)

考虑创建包含存储/检索所需信息的结构。标头结构看起来像

typedef struct
{
  short floors;
  short apartments;
} header;

你为文件的其他部分做了更多的结构。

然后当您从文件中读取(frwrite to write)时,您会执行类似

的操作
header h;
fread( &h, sizeof(h), 1, fp );

现在使用标题中的信息可以计算出如何读/写文件的其余部分。对于文件的其余部分,您将拥有其他结构,但我留给您解决。