指针所指向的字符串在何处/如何存储在文件中?

时间:2011-05-28 08:39:13

标签: c visual-c++ file-io

以下代码示例将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 *类型)指向的名称字符串在何处以及如何存储在二进制文件中。

感谢。

2 个答案:

答案 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;