#c #visual-c #file-io
#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("nt cannot open file. . .");
return 1;
}
printf_s("%d records written successfully. . .",fwrite(amp;e1,sizeof(EMPLOYEE),1,fptr));
fseek(fptr,0,SEEK_SET);
fread(amp;e2,sizeof(EMPLOYEE),1,fptr);
printf_s("nID = %dnName = %snSalary = .2lf",e2.emp_id,e2.emp_name,e2.emp_salary);
fclose(fptr);
_getch();
return 0;
}
Мой вопрос в том, где и как строка имени, на которую указывает e1.emp_name (тип char *), сохраняется в двоичном файле.
Спасибо.
Комментарии:
1. Опубликуйте определение EMPLOYEE.
Ответ №1:
Она вообще не сохраняется.
Сохраняется двоичное содержимое char *emp_name
указателя — адрес статической строки "Ravi Shekhar"
. Поскольку вы записываете эти данные и считываете их снова во время того же сеанса выполнения вашей программы, это значение указателя остается действительным. Т.Е. Когда вы считываете его из файла, оно по-прежнему указывает на ту же статическую строку "Ravi Shekhar"
, на которую указывало изначально.
Если вы разделите свою программу на две программы (одна выполняет запись, а другая — чтение), вы обнаружите, что программа «reader» больше не может «читать» строку из файла, поскольку на самом деле ее там нет. Вы просто прочитаете двоичное значение указателя, которое нигде не указывает внутри программы «reader».
Ответ №2:
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] = '';
e1.emp_salary = 10000;