在二进制文件C语言中编写和读取

时间:2013-05-24 00:18:00

标签: c binaryfiles

我获得了管理某种音乐商店的任务。在数据库(保存为.dat文件)中,我们有艺术家姓名和专辑。

我在编写和阅读文件时遇到了问题。 首先,即使我不写任何东西,只需创建文件,然后在记事本中打开文件,我看到乱码和中文或日文字母。 即使我写入失败,或使用visual studio读取它,这似乎并没有改变。这是我的代码:

我打开了文件:

p=fopen("database.dat","w+");

添加项目功能:

void add_item(char* artist,char* record,FILE* p) //adds an item with artist and record to store
{
    item node;
    int item_size=sizeof(item);
    rewind(p);
    strcpy(node.artist,artist);
    strcpy(node.record,record);
    fwrite(&node,item_size,1,p);
    printf("Data added\n");
}

item是用于在商店中定义单个项目的结构。它有2个字段,字符串艺术家和字符串记录。

typedef struct item
{
    char artist[100],record[100];
}item;

这是为了阅读:

void print_file(FILE* p) //print the entire file
{
    int size=sizeof(item);
    item node;
    rewind(p);
    while(!feof(p))
    {
        fread(&node,size,1,p);
        printf("%s - %s\n",node.artist,node.record);
    }
}

如果我使用print_file,我会看到乱码,如果我实际上用记事本打开文件,我会看到日语。

帮助! :d

编辑:刚刚发现了一些东西。如果我添加一个项目,然后读取该文件,我将读取该项目。但如果我再次运行该程序,并尝试立即读取该文件,我会看到乱码。

2 个答案:

答案 0 :(得分:2)

问题在于“w +”,它会将现有文件截断为零长度并将其打开以进行写入&读。当你第二次运行程序时,这就是发生的事情,你的阅读(写入之前)会返回乱码。 更多关于fopen here

答案 1 :(得分:-1)

我猜测根据你的症状,字符串被定义为char*而不是char[],这将是你的问题。文件上的字符串IO不起作用。请记住,字符串实际上是char*类型,即指向一个或多个8位整数的指针。当您将字符串写入文件时,您实际上是在写入地址本身的值,而不是它指向的字符。

您应该使用fprintf()函数将字符串写入文件:
http://www.cplusplus.com/reference/cstdio/fprintf/
然后fscanf()阅读它们:
http://www.cplusplus.com/reference/cstdio/fscanf/

通常,如果您要将结构用作文件格式,则不能在结构中添加指针。您可以放置​​char[]值,因为它们的处理方式与指针不同,但这需要对字符串大小进行硬性限制。这就是为什么一些人不鼓励将结构体作为文件格式的原因之一 - 更好地一次读取和写入一个值,适当地处理字符串等等。

当您立即(在退出程序之前)读回文件时它起作用的原因是因为该指针地址对该字符串仍然有效。但字符串本身从未写入文件。