scanf(«%d»,

#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 вместо этого.