#c #scanf #structure
Вопрос:
typedef struct info{ //main record
int *id;
unsigned char *name;
}student;
void create(){
student *s_ptr;
int num_of_student,i;
FILE *f_ptr;
f_ptr = fopen("studentdata.txt","w");
printf("**How many student to record**n");
printf("Enter:");
scanf("%d",amp;num_of_student);
s_ptr = (student*)calloc(num_of_student,sizeof(student));
for(i=0;i<num_of_student;i ){
printf("Enter student id: ");
scanf("%d",amp;s_ptr[i]);//while string format is %d it prints char value to the file.
fflush(stdin);
printf("Enter student full name: ");
scanf("%[^n]",amp;(s_ptr i)->name);
fwrite(s_ptr i,sizeof(struct info),1,f_ptr);
}
}
scanf("**%d**",amp;s_ptr[i])
печатает его относительное символьное значение в файле, но после изменения формата строки с %d
на %s
него выводится значение acutal int. почему?
Комментарии:
1. Оба
scanf
утверждения в цикле неверны, так же какstudent
и структура. Почему ваша структура содержит указатели? Почему бы вам не выделить какую-либо память для этих указателей, на которые можно указать? Почему первый scanf использует адрес самой структуры, а не переменную в структуре? Избавьтесь от указателей и исправьте первый scanf для чтения вid
переменной, а затем посмотрите, что у вас есть.2. Типы в строке
scanf
формата не соответствуют параметрам. Тоname
должно быть аchar*
, а неunsigned char*
. Вероятно, лучше всего начать с более простой программы или минимального воспроизводимого примера и оттуда расширить код.3. Я только начинал знакомиться с указателями, поэтому попробовал этот способ, но теперь я знал, что массив будет лучше для персонажа. Спасибо за комментарий.
Ответ №1:
scanf
не имеет никакого отношения к тому, как данные записываются в файл.
fwrite
записывайте данные в файлы, и он записывает данные точно так, как они существуют в памяти компьютера.
int
существует в виде двоичного представления числа, точного значения (обычно длиной 4 или 8 байт).
Если вы позволите fwrite
сохранить эти байты в файле, а затем посмотрите на них как на текст, вы увидите некоторые символы, но не те, которые представляют десятичные цифры числа.
Это связано с тем, что ваш текстовый редактор не может знать, что эти байты принадлежат к int
типу языка C и должны быть повторно интерпретированы для просмотра.
Если вы хотите, чтобы эти байты были напечатаны в файле в удобочитаемой форме, используйте fprintf
вместо этого.