2016-03-31 3 views
1
#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
#include<string.h> 

struct student{ 
    char *name; 
    char *addr; 
    int age; 
    int clas; 
}*stu; 

int main() 
{ 
    FILE *fp; 
    int choice,another; 
    size_t recsize; 
    size_t length; 

    struct student *stu=(struct student *)malloc(sizeof(struct student)); 
    stu->name=(char *) malloc(sizeof(char)*20); 
    stu->addr=(char*)malloc(sizeof(char)*20); 

    recsize=sizeof(*stu); 


      fp=fopen("student.txt","a+"); 
      if(fp==NULL) 
       { 
       fp=fopen("student.txt","w+"); 
       if(fp==NULL) 
        { 
        printf("cannot open the file"); 
        exit(1); 
        } 
       } 

       do 
       { 
        fseek(fp,1,SEEK_END); 
        printf("Please Enter student Details\n"); 

        printf("Student Name: "); 
        scanf("%s",stu->name); 

        printf("Address: "); 
        scanf("%s",stu->addr); 

        printf("Class: "); 
        scanf("%s",&stu->clas); 

        printf("Age: "); 
        scanf("%s",&stu->age);      

        fwrite(stu,recsize,1,fp); 

        printf("Add another Enter 1 ?\n"); 
        scanf("%d",&another); 
        }while(another==1); 
        fclose(fp); 
     free(stu); 


    } 

У меня есть код в C, который имеет структуру Студент. Я пытаюсь получить все значения элементов структуры от пользователя. Память распределена для структуры и двух элементов * name и * addr. когда я пытаюсь записать эти значения, используя функцию fwrite() в файле Student.txt, он показывает случайный вывод (ཀའ ㌱ 䔀 8 䵁 ཀའ ㈱ 䔀 1 䵁), как это в файле, и это не в читаемой форме. Пожалуйста, предоставьте мне лучший способ написать элементы структуры в файле, используя функцию fwrite().Как написать элементы структуры сразу в файле с помощью функции fwrite()?

+2

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

+1

'scanf ("% s ", & stu-> clas);' 'scanf ("% s ", & stu-> age);' вы записываете строки в контейнеры int, потенциально повреждая память –

+0

@DavidHoelzer, возможно ли это написать какой указатель содержит? Я знаю, что мой код будет работать, если * имя изменено на имя [20], а * addr изменено addr [20]. –

ответ

2

Вы должны использовать %d вместо %s для int s

printf("Class: "); 
scanf("%s",&stu->clas); 

printf("Age: "); 
scanf("%s",&stu->age); 

должен быть

printf("Class: "); 
scanf("%d",&stu->clas); 

printf("Age: "); 
scanf("%d",&stu->age); 

И как отметил @David Hoelzer в комментариях: вы пишете значение из указатели, а не то, что они содержат, изменить

struct student{ 
    char *name; 
    char *addr; 

к

struct student{ 
    char name[20]; 
    char addr[20]; 

и удалить эти строки:

stu->name=(char *) malloc(sizeof(char)*20); 
stu->addr=(char*) malloc(sizeof(char)*20); 
+0

Я исправляю его, но и вывод случайного характера. так как я использую указатель, что лучше всего написать элемент структуры в файле с помощью fwrite. –

+0

fwrite пишет сырые байты, если вы хотите, чтобы форматированный текст использовал fprintf –

+0

@EttoreBarattelli Спасибо за информацию. Итак, как мы можем читать эти необработанные байты в читаемом формате, есть ли какая-либо функция для этого? –