2016-05-30 2 views
-3

Я пишу программу, которая позволяет пользователям добавлять вопрос с 4 ответами, правильным ответом, датой, автором и уровнем сложности, а также программа имеет функции для чтения всех вопросов и удаление вопроса. Когда я выберу вариант, добавьте вопрос, и я вставим все характеристики, появляющиеся в окне сообщения об ошибке, это также не позволяет мне удалить или увидеть `. вопросы. мне нужна помощь.Ошибка отладки C - Не удаляется

Почему следующий код не позволяет мне удалять свой вопрос?

void edit() 
{ 

    char filename[2]; 
    int y; 
    int q,ft,s,t, fr,d,a,l,tr,n,da; 
    FILE *f, *f1; 

    f=fopen("pff.txt","r"); 
    if (f==NULL) 
    { 
     perror ("Error!"); 
    } 


    fscanf(f,"%d",&y); 


    printf("   "); 
    gets(question.name); 
    n=sizeof(question.name); 

    printf("Name : "); 
    gets(question.name); 
    q=sizeof(question.name); 

    printf("Answer 1: "); 
    gets(question.first); 
    ft=sizeof(question.first); 

    printf("Answer 2: "); 
    gets(question.second); 
    s=sizeof(question.second); 

    printf("Answer 3: "); 
    gets(question.third); 
    t=sizeof(question.third); 

    printf("Answer 4: "); 
    gets(question.fourth); 
    fr=sizeof(question.fourth); 

    printf("Right answer (1-4): "); 
    scanf("%d",&question.tr); 

    printf(" "); 
    gets(question.date); 
    da=sizeof(question.date); 

    printf("Date: "); 
    gets(question.date); 
    d=sizeof(question.date); 

    printf(" Author: "); 
    gets(question.author); 
    t=sizeof(question.author); 

    printf("Level (0-2): "); 
    scanf("%d",&question.level); 
    fclose (f); 

    sprintf(filename, "%d.bin", y+1); 
    puts (filename); f=fopen(filename,"wb"); 



    fwrite(&q,sizeof(int),1,f); 
    fwrite(question.name,sizeof(question.name),1,f); 
    fwrite(&ft,sizeof(int),1,f); 
    fwrite(question.first,sizeof(question.first),1,f); 
    fwrite(&s,sizeof(int),1,f); 
    fwrite(question.second,sizeof(question.second),1,f); 
    fwrite(&t,sizeof(int),1,f); 
    fwrite(question.third,sizeof(question.third),1,f); 
    fwrite(&fr,sizeof(int),1,f); 
    fwrite(question.fourth,sizeof(question.fourth),1,f); 
    fwrite (&question.tr, sizeof (int),1,f); 
    fwrite(&d,sizeof(int),1,f); 
    fwrite(question.date, sizeof(question.date),1,f); 
    fwrite(&a,sizeof(int),1,f); 
    fwrite(question.author,sizeof(question.author),1,f); 
    fwrite(question.level,sizeof(int),1,f); 

    fclose(f); 

    f=fopen("pff.txt","w"); 
    fprintf(f,"%d",y+1); 
    fclose(f); 


} 
+0

Вы забыли фактически задать вопрос. Какая помощь вам нужна? –

+0

помогите понять, что случилось с моей ошибкой, и почему это не так. –

+0

Каким образом это происходит? Вы говорите что-то о окне сообщения, но что говорит эта коробка? Вы говорите, что не можете ничего делать, но не говорите нам, что происходит, когда вы пытаетесь. Кроме того, нет ничего, указывающего на то, что код, который вы показали, является * предположительным *, чтобы сделать, поэтому трудно сказать, что он делает неправильно, если что-либо. Каким должен быть формат файла? Линии? –

ответ

0
  • Буфер filename слишком коротка, чтобы сохранить имя файла. Он должен иметь длину не менее 16 символов, если int имеет длину 32 бит.
  • Не зная фактическое определение, линия fwrite(question.level,sizeof(int),1,f); кажется неправильным, так как адрес question.level передается scanf с использованием %d спецификатора, и я думаю, его тип int. Вы должны включить правильный заголовок и включить предупреждения компилятора.
  • Вы не должны пройти NULL, который может быть возвращен с fopen, до fscanf.
  • Вы не должны использовать gets из стандартной библиотеки, которая имеет неизбежный риск переполнения буфера и устарела на C99 и удалена на C11.

Попробуйте это (проблема, что gets используется не решен здесь):

void edit() 
{ 

    char filename[32]; /* allocate enough buffer */ 
    int y; 
    int q,ft,s,t, fr,d,a,l,tr,n,da; 
    FILE *f, *f1; 

    f=fopen("pff.txt","r"); 
    if (f==NULL) 
    { 
     perror ("Error!"); 
     return; /* avoid using NULL as file pointer */ 
    } 


    fscanf(f,"%d",&y); 


    printf("   "); 
    gets(question.name); 
    n=sizeof(question.name); 

    printf("Name : "); 
    gets(question.name); 
    q=sizeof(question.name); 

    printf("Answer 1: "); 
    gets(question.first); 
    ft=sizeof(question.first); 

    printf("Answer 2: "); 
    gets(question.second); 
    s=sizeof(question.second); 

    printf("Answer 3: "); 
    gets(question.third); 
    t=sizeof(question.third); 

    printf("Answer 4: "); 
    gets(question.fourth); 
    fr=sizeof(question.fourth); 

    printf("Right answer (1-4): "); 
    scanf("%d",&question.tr); /* warning: don't place newline character after the number to be read here, or what is read to question.date may become not what is wanted */ 

    printf(" "); 
    gets(question.date); 
    da=sizeof(question.date); 

    printf("Date: "); 
    gets(question.date); 
    d=sizeof(question.date); 

    printf(" Author: "); 
    gets(question.author); 
    t=sizeof(question.author); 

    printf("Level (0-2): "); 
    scanf("%d",&question.level); 
    fclose (f); 

    sprintf(filename, "%d.bin", y+1); 
    puts (filename); 
    f=fopen(filename,"wb"); 
    if (f == NULL) return; /* add error check */ 


    fwrite(&q,sizeof(int),1,f); 
    fwrite(question.name,sizeof(question.name),1,f); 
    fwrite(&ft,sizeof(int),1,f); 
    fwrite(question.first,sizeof(question.first),1,f); 
    fwrite(&s,sizeof(int),1,f); 
    fwrite(question.second,sizeof(question.second),1,f); 
    fwrite(&t,sizeof(int),1,f); 
    fwrite(question.third,sizeof(question.third),1,f); 
    fwrite(&fr,sizeof(int),1,f); 
    fwrite(question.fourth,sizeof(question.fourth),1,f); 
    fwrite (&question.tr, sizeof (int),1,f); 
    fwrite(&d,sizeof(int),1,f); 
    fwrite(question.date, sizeof(question.date),1,f); 
    fwrite(&a,sizeof(int),1,f); 
    fwrite(question.author,sizeof(question.author),1,f); 
    fwrite(&question.level,sizeof(int),1,f); /* add & before question.level */ 

    fclose(f); 

    f=fopen("pff.txt","w"); 
    if (f != NULL) { /* add error check */ 
     fprintf(f,"%d",y+1); 
     fclose(f); 
    } 


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