когда fread to struct, неправильный вывод в c - PullRequest
0 голосов
/ 15 мая 2018

На самом деле код турецкий, но я перевел какое-то слово, может быть, оно вам поможет.

Структура:

    typedef struct
{
char name[100];
char surname[100];
char idNo[11];
char tel[11];
char address[200];
char email[100];
}personel;

Код:

void personelListele(){

FILE *pdosya;

personel personelBilgi;

pdosya = fopen("personel.txt","rb");
if(pdosya==NULL){
    printf("personel.txt dosyası açılamadı");
    exit(1);
}

int c;

while(c!=0)
{
    c = fread(&personelBilgi,sizeof(personel),1,pdosya);

    if(c!=0){

        printf("Name= %s\n",personelBilgi.name);
        printf("Surname= %s\n",personelBilgi.surname);
        printf("id = %s\n",personelBilgi.idNo);
        printf("Tel = %s\n",personelBilgi.tel);
        printf("Address = %s\n",personelBilgi.addres);
        printf("Email = %s\n",personelBilgi.email);


        }
    }
}

Ввод:

Name:Guven

Surname:Yildiz

id No:12312312312

Tel No:98798798798

Email:mail@mail.com

Address:somewhere

Выход:

Name = Guven
Surname = Yildiz
id No = 1231231231298798798798mail@mail.com
Tel No = 98798798798mail@mail.com
Email = mail@mail.com
Address = somewhere

IDNO выход смешан идно, тельно и почта.Это то же самое для тельно.Я не знаю, почему это произошло.Я пытался поменяться местами, но не работает.

Спасибо за помощь.

1 Ответ

0 голосов
/ 15 мая 2018

Учитывая этот вход:

id No:12312312312

составляет 11 символов, вы переполнены

char idNo[11];

, потому что вы не можете использовать пробел для завершающего символа '\0', добавляемого в строку.

В этом случае вы можете сказать, что произошло переполнение, потому что вы печатаете переменную в виде строки c в массиве символов, который не заканчивается нулем. В этом случае поведение не определено, но поскольку вы прочитали данные в struct, вызов printf продолжает читать в памяти, пока не найдет '\0', который окажется в следующем массиве символов вашей структуры. , Отсюда узнаваемое число.

...