我获得了管理某种音乐商店的任务。在数据库(保存为.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
编辑:刚刚发现了一些东西。如果我添加一个项目,然后读取该文件,我将读取该项目。但如果我再次运行该程序,并尝试立即读取该文件,我会看到乱码。
答案 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[]
值,因为它们的处理方式与指针不同,但这需要对字符串大小进行硬性限制。这就是为什么一些人不鼓励将结构体作为文件格式的原因之一 - 更好地一次读取和写入一个值,适当地处理字符串等等。
当您立即(在退出程序之前)读回文件时它起作用的原因是因为该指针地址对该字符串仍然有效。但字符串本身从未写入文件。