Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > зависает fclose


Автор: joker332 30.10.2009, 15:00
Драстуйте!Вот написал программ, но она почему то засисает после выполнения закрытия файла(fclose(f1);)!Почему??У меня ище такой вопросик, может я что то напутал с realloc??Посмотри плз!
Код
/

#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"


    typedef struct MyGoods{
        char name[10];
        int id_code;
        char izmer[10];
        int price;
    } Goods;

void Add_to_File(Goods * ptr){
    int z=1;
    FILE *f;
    f = fopen( "read.txt", "a+b");
    fwrite(ptr,sizeof(Goods), 1,f);
    fclose(f);
}
int _tmain(int argc, _TCHAR* argv[])
{
    system("cls");
    int d=0;    
    int nCount=2;
    

    Goods *A;
    //A= new Goods[2];
    
    Goods * ptr =(Goods *)malloc(sizeof(Goods)*nCount);
    printf("programm Goods\r\n");
    printf("\r\nEnter 1: add to file");
    printf("\r\nEnter 2: edit file");
    printf("\r\nPlease enter key 1,2,3,4,5,6,7,8,9,0");

    d=getch();
    
    switch(d){
        case 49:{
            system("cls");
            printf("ADD");
            printf("Enter name ");
            scanf("%s", &ptr->name);
            printf("id code ");
            scanf("%i", &ptr->id_code);
            printf("Enter izmer ");
            scanf("%s", &ptr->izmer);
            printf("Enter price ");
            scanf("%i", &ptr->price);
            Add_to_File(ptr);
            break;
                }
        case 50: {
            printf("enter 2"); 
            int z=1;
            FILE *f1;
            ptr=(Goods*)realloc(ptr, 4);
            f1 = fopen( "read.txt", "r");
            size_t res=fread(ptr,sizeof(Goods), 4,f1);
//            ptr=(Goods*)realloc(ptr, sizeof(Goods)*res);//перероспределения памяти
            //fread(ptr,sizeof(Goods), res,f);
            
            
        //    for( ptr=A; ptr<4+A; ptr++){
            printf("%s", ptr->name);
            printf("%i", ptr->id_code);
            printf("%s", ptr->izmer);
            printf("%i", ptr->price);
            
            fclose(f1);///[color=red]После выполнения закрытия программа зависает!почему???[/color]
        
            
            system("cls");
            //}
            break;
                 }

    }
    //}

    getch();
    

    return 0;
}




Автор: 17dufa 30.10.2009, 15:07
joker332, зачем Вам вообще realoc? и чем не устраивает статическое выделение памяти?
и вот это 
Код

f1 = fopen( "read.txt", "r");

лучше заменить вот на это:
Код

f1 = fopen( "read.txt", "rb");

Автор: xvr 30.10.2009, 15:50
Зависает после realloc в 60й строке. Нужно так:
Код

ptr=(Goods*)realloc(ptr, 4*sizeof(Goods));


Автор: joker332 2.11.2009, 16:06
17dufa у меня такое задание!(
Я вот немного подправил код и привел только ту часть которая работает некоректно!
При прохождении строчки ptr=(Goods*)realloc(ptr, sizeof(Goods)*(res-1));
вылазит вот такое 
Windows has triggered a breakpoint in laba3_joker.exe.

This may be due to a corruption of the heap, and indicates a bug in laba3_joker.exe or any of the DLLs it has loaded.

The output window may have more diagnostic information
В чем может быть ошибка!Что я делаю не правильно???
Код

....
        case 50: {
            printf("enter 2"); 
            int z=1;
            FILE *f1;
            f1 = fopen( "read.txt", "r");
            size_t res=fread(ptr,sizeof(Goods), 100,f1);
            ptr=(Goods*)realloc(ptr, sizeof(Goods)*(res-1));
//            ptr=(Goods*)realloc(ptr, sizeof(Goods)*res);
            fread(ptr,sizeof(Goods), res,f1);
            
            
        //    for( ptr=A; ptr<4+A; ptr++){
            printf("%s", ptr->name);
            printf("%i", ptr->id_code);
            printf("%s", ptr->izmer);
            printf("%i", ptr->price);
            
            fclose(f1);
        
            
            system("cls");
            //}
            break;
                 }


Автор: xvr 2.11.2009, 16:30
Вот это
Код

size_t res=fread(ptr,sizeof(Goods), 100,f1);
считает в массив ptr 100 штук Goods - к вас там достаточно места для 100 штук?
Далее
Код

            ptr=(Goods*)realloc(ptr, sizeof(Goods)*(res-1));
проверьте, чему тут равен res - если он меньше 1, то в realloc попадет неверный размер (очень большой)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)