Где / Как строка, указанная указателем, сохраняется в файле? - PullRequest
3 голосов
/ 28 мая 2011

В следующем примере кода записывается структурная переменная типа 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 ]

4 голосов
/ 28 мая 2011

Это не хранится вообще.

Сохраняется двоичное содержимое указателя char *emp_name - адрес статической строки "Ravi Shekhar". Поскольку вы записываете эти данные и снова читаете их во время того же сеанса выполнения вашей программы, это значение указателя остается действительным. То есть когда вы читаете его из файла, он все еще указывает на ту же статическую строку "Ravi Shekhar", на которую он указывал изначально.

Если вы разделите вашу программу на две программы (одна пишет, а другая читает), вы обнаружите, что программа «чтения» больше не может «читать» строку из файла, так как ее на самом деле нет. , Вы просто прочитаете двоичное значение указателя, которое нигде не указывается в программе «чтения».

3 голосов
/ 28 мая 2011

Элемент 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...