2014-12-10 1 views
-1

Привет Я пытаюсь написать структуру в файл. Ниже приведен код.Запись структуры в файл, дающая значение для мусора

#include<stdio.h> 
    #include<string.h> 
    #include<stdlib.h> 

    /*structure*/ 
    struct student 
    { 
     char name[10]; 
     char space[1]; 
     char rollno[5]; 
    }head_rec; 

    /*main*/ 
    void main() 
    { 
     FILE *fout; 
     if(fout=fopen("output.txt","w")==NULL) 
     { 
      printf("Cannot open the file to write"); 
      exit; 
     } 
     memset(&head_rec,'\0',sizeof(struct student); 
     sprint(head_rec.name,"SOUMYA",6); 
     memset(head_rec.space,' ',1); 
     memset(head_rec.rollno,'\0',sizeof(head_rec.rollno); 
     sprint(head_rec.rollno,"0000",4); 
     head_rec.rollno[4]='\0'; 
     fwrite(&head_rec,sizeof(struct student),1,fout); 
    } 

Выход:

Soumya 0000^@

Как избавиться от этого последнего символа?

+0

также, его лучше использовать 'fprintf()' 'над FWRITE()' для считываемых выходов человека. –

+0

Я хотел написать всю структуру, а не отдельные члены. Возможно ли это с fprintf? –

+0

до этого, пожалуйста, сообщите нам, что это такое 'if (fout = fopen (" output.txt "," w "))'? ты знаешь, что делаешь? –

ответ

1

Поскольку вы пишете всю структуру в файл, вам нужно избегать заполнения. Это можно сделать так:

#pragma pack(push) 
#pragma pack(1) 
    struct student 
     { 
     char name[10]; 
     char space[1]; 
     char rollno[5]; 
     }head_rec; 
#pragma pack(pop) 

Кроме того, ваша главная функция должна возвращать integer значение. Меняем void main() к int main()

На другой ноте: использовать snprintf вместо sprintf, так что вы можете указать максимальный размер буфера назначения, что делает его более безопасным.

Plus:

if(fout=fopen("output.txt","w")) 

должно быть:

if((fout=fopen("output.txt","w"))==NULL) 
+0

Спасибо за вашу помощь. Но это не работает для меня. :( –

+0

@SoumyaSaraswataDash хорошо, если вы хотите написать 'struct' с' char arrays', вам нужно избегать нулевого символа в конце массива символов! В противном случае он будет записан в файл.Вы также должны убедиться, что каждый массив имеет такое же количество символов, сколько вы хотите сохранить. Поэтому сохранение «SOUMAYA» в имени длиной 10 байт не будет работать, поскольку байты, следующие за завершающим нулевым символом, не определены. Таким образом, «SOUMAYA» нужно будет хранить в массиве ровно 7 байт. Тем не менее, я предлагаю использовать что-то вроде: (продолжение следует) ... –

+0

'snprintf (temp, sizeof (temp),"% s% s% s ", head_rec.name, head_rec.space, head_rec.rollno); fwrite (temp, 1, strlen (temp), fout); 'и не забудьте« fclose (fout); fout = NULL; ' –

Смежные вопросы