以下代码示例将EMPLOYEE类型的结构变量写入文件,然后使用fread将结构读回另一个变量。
int main()
{
EMPLOYEE e1,e2;
FILE *fptr;
e1.emp_id=2240;
e1.emp_name="Ravi Shekhar";
e1.emp_salary=10000;
fptr=fopen("c:\\employee.emp","w+b");
if(fptr == NULL)
{
printf_s("\n\t cannot open file. . .");
return 1;
}
printf_s("%d records written successfully. . .",fwrite(&e1,sizeof(EMPLOYEE),1,fptr));
fseek(fptr,0,SEEK_SET);
fread(&e2,sizeof(EMPLOYEE),1,fptr);
printf_s("\nID = %d\nName = %s\nSalary = %10.2lf",e2.emp_id,e2.emp_name,e2.emp_salary);
fclose(fptr);
_getch();
return 0;
}
我的问题是e1.emp_name(一个char *类型)指向的名称字符串在何处以及如何存储在二进制文件中。
感谢。
答案 0 :(得分:4)
根本没有存储。
存储的是char *emp_name
指针的二进制内容 - 静态字符串"Ravi Shekhar"
的地址。由于您在程序的同一执行会话期间写入该数据并再次读取它,因此该指针值仍然有效。即当你从文件中读取它时,它仍然指向它最初指向的相同静态字符串"Ravi Shekhar"
。
如果你将你的程序分成两个程序(一个是写作而另一个是读取),你会发现“读者”程序不能再从文件中“读取”字符串,因为它实际上并不存在。你只需读取一个二进制指针值,它在“阅读器”程序中无处可寻。
答案 1 :(得分:3)
emp_name
成员是指向char
的指针。因此,指针本身将存储在文件中,而不是它指向的字符串。该字符串将丢失,如果程序在中间重新启动,则从文件中读回指针将毫无意义。
您可以通过在char
结构中存储EMPLOYEE
数组而不是指针来解决该问题。但是,在这种情况下,您将无法再直接为其分配值,而是必须使用strncpy()
之类的内容:
e1.emp_id = 2240;
strncpy(e1.emp_name, "Ravi Shekhar", sizeof(e1.emp_name));
// Add a null terminator in case emp_name wasn't large enough.
e1.emp_name[sizeof(e1.emp_name) - 1] = '\0';
e1.emp_salary = 10000;