Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Заполнение списка из файла!!

56K
15 мая 2010 года
_EXP_
13 / / 13.05.2010
Нужно заполнить список словами из файла!
Какие-то проблемы с циклом если пишу if(!fd_s.eof()) выводится только первый элемент из файла , если while(!fd_s.eof()) то последний.
Код:
struct Item {
    char strok[32];
    Item* elemNext;
    Item* elemPrev;
};

struct List
{
    Item* itsFirst;
    Item* itsLast;
};
List* theList = 0;

// заполнение списка
void list_in_file(List& theList)
{
 std::ifstream fd_s("file_name.txt", std::ios::in);

if(!fd_s.eof())
{  
Item* newItem=new Item; //указатель на новый элемент списка
       
fd_s.getline(newItem->strok,sizeof(newItem->strok));

if(theList.itsFirst)
    {
        theList.itsFirst->elemNext=newItem;
        theList.itsFirst=newItem;
       
    }      
    theList.itsFirst=newItem;
    newItem->elemNext=0;

   
}
std::cout<<"Item was added"<<std::endl<<std::endl;
}


Содержание файла
Код:
int
main
stryct
class
float
double
enum
return
break
goto
cout
cin
printf
scanf
new
delet
malloc
getch
while
for
switch
2.1K
16 мая 2010 года
Norgat
452 / / 12.08.2009
ммм... во первых нужно использовать while(!fd_s.eof()), т.к. тебе нужно считать все строки из файла...

дальше...

 
Код:
if(theList.itsFirst)
    {
        theList.itsFirst->elemNext=newItem;
        theList.itsFirst=newItem;
    }      
    theList.itsFirst=newItem;
    newItem->elemNext=0;
}




судя по всему проблема в том, что ты забываешь определить newItem->elemPrev...

т.е., если я правильно понял логику работы списка, ты добавляешь элемент newItem в список и указываешь, что перед ним ничего нет - newItem->elemNext=0... вот только указатель newItem на элемент после него не определен... т.е. newItem->elemPrev не используется и скорее всего именно в этом ошибка.
в итоге твой код лишь заменяет единственный элемент списка, вместо того, чтобы перекинуть указатели...


уже выкладывал свой старый код тут: http://forum.codenet.ru/showpost.php?p=322215&postcount=13
посмотри, там примерно то же, что и у тебя, только вместо строки я использую численное поле


П.С. а вообще, для выявления таких ошибок хорошо помогает Debugger Visual Studio и его вкладочка Watch...

п.с.с. у всех обострение написания кода для курсовиков?))) мне бы ваши проблемы)) я вот замучался писать сам текст для курсача)) ибо большая часть теории у меня в английских статьях и не имеет нормальных аналогов на русском(((



ах да... используй вместо 0 - NULL(так правильнее), и вместо if(theList.itsFirst) явную проверку, скажем if(theList.itsFirst!= NULL), а так читабельнее
56K
17 мая 2010 года
_EXP_
13 / / 13.05.2010
Вроде поправил как везде в книгах советуют вообще ни одного элемента не выводится!!
Код:
// заполнение списка
void list_in_file(List& theList)
{
 std::ifstream fd_s("file_name.txt", std::ios::in);

while(!fd_s.eof())
{  
Item* newItem=new Item; //указатель на новый элемент списка
       
fd_s.getline(newItem->strok,sizeof(newItem->strok));

        newItem->elemNext=theList.itsFirst;
        newItem->elemPrev=NULL;    
        if(theList.itsFirst)
    {
        theList.itsFirst->elemPrev=newItem;
        theList.itsFirst=newItem;
       
    }      
    if(!theList.itsLast)
    {
        theList.itsLast=theList.itsFirst;
    }
    delete [] newItem;
}
std::cout<<"Item was added"<<std::endl<<std::endl;
}
2.1K
17 мая 2010 года
Norgat
452 / / 12.08.2009
 
Код:
delete [] newItem;


естественно... вы же добавляете элемент и сразу его того, удаляете)
лучше эту строчку удалите из своего кода))
56K
17 мая 2010 года
_EXP_
13 / / 13.05.2010
Цитата: Norgat
 
Код:
delete [] newItem;


естественно... вы же добавляете элемент и сразу его того, удаляете)
лучше эту строчку удалите из своего кода))



Да удалил но роли она не сыграла!!!

2.1K
17 мая 2010 года
Norgat
452 / / 12.08.2009
Цитата: _EXP_
Да удалил но роли она не сыграла!!!



мм... тогда сделай так.... добавь после fd_s.getline(...)
std::cout << "read Item: " << newItem->strok << std::endl;

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

и выложи свой код вывода списка на экран, может у тебя в него ошибка закралась?

56K
18 мая 2010 года
_EXP_
13 / / 13.05.2010
из файла считываются и выводятся все слова!!
Код:
struct Item {
    char strok[32];
    Item* elemNext;
    Item* elemPrev;
};

struct List
{
    Item* itsFirst;
    Item* itsLast;
};
List* theList = 0;

// вывод списка
void printfList(List& theList)
{  
std::cout<<"++++++List content +++++++"<<std::endl;
Item* curItem=theList.itsFirst; // указатель на начало списка
while(curItem)
{
    std::cout<<curItem->strok<<std::endl;
    curItem=curItem->elemNext;
}
    std::cout<<"End List"<<std::endl<<std::endl;
}



// заполнение списка
void list_in_file(List& theList)
{
 std::ifstream fd_s("file_name.txt", std::ios::in);

while(!fd_s.eof())
{  
Item* newItem=new Item; //указатель на новый элемент списка
       
fd_s.getline(newItem->strok,sizeof(newItem->strok));
std::cout << "read Item: " << newItem->strok << std::endl;
        newItem->elemNext=theList.itsFirst;
        newItem->elemPrev=NULL;    
        if(theList.itsFirst)
    {
        theList.itsFirst->elemPrev=newItem;
        theList.itsFirst=newItem;
       
    }      
    if(!theList.itsLast)
    {
        theList.itsLast=theList.itsFirst;
    }
   
}
std::cout<<"Item was added"<<std::endl<<std::endl;
}

// поиск
void findList(List& theList)
{  
char my_ind [32];
std::cout<<"++++++Input indif +++++++"<<std::endl;
std::cin>>my_ind;
Item* curItem=theList.itsFirst; // указатель на начало списка
while(curItem)
{
    if(curItem->strok==my_ind)
{
std::cout<<"Inpet"<<std::endl;
}
else
{
std::cout<<"No Input"<<std::endl;
}
    curItem=curItem->elemNext;
}
    std::cout<<"End List"<<std::endl<<std::endl;
}


void menu()
{
    while(true)
    {
        bool quit=false;
        int choice;
        std::cout<<"++++++++++++++MENU+++++++++++"<<std::endl;
        std::cout<<"(1) Creat List"<<std::endl;
        std::cout<<"(2) Add List"<<std::endl;
        std::cout<<"(3) Printf List"<<std::endl;
        std::cout<<"(4) Find List"<<std::endl;
        std::cout<<"(5) Quit"<<std::endl;
        std::cout<<std::endl;
        std::cin>>choice;
        std::cout<<std::endl;
        switch(choice)
        {
            case (1):
            if(!theList)
            {
                theList=new List;
                theList->itsFirst=0;
                theList->itsLast=0;
               
                std::cout<<"The List has been created succesfully"<<std::endl<<std::endl;
                }
                else
                {
                std::cout<<"The List is already created"<<std::endl<<std::endl;
                }
                break;
                case (2):
                if(theList)
                {

                    list_in_file(*theList);
                }
                else
                    std::cout<<"The List is not created"<<std::endl<<std::endl;
                break;
                case (3):
                if(theList)
                {
                    printfList(*theList);
                }
                else
                    std::cout<<"The List is not created"<<std::endl<<std::endl;
                break;
        case (4):
        if(theList)
                {
                    findList(*theList);
                }
                else
                    std::cout<<"The List is not created"<<std::endl<<std::endl;
                break;
                    case (5):
                    quit=true;
        }
        if (quit==true)
            break;
       
   
    }
}
2.1K
18 мая 2010 года
Norgat
452 / / 12.08.2009
пл пунктам:
1) List* theList = 0; - это зачем?
2) уже писал, но напишу ещё раз...
проверки типа while(curItem) - плохой стиль, пиши while(curItem!= NULL)

3)
 
Код:
if(theList.itsFirst)
    {
        theList.itsFirst->elemPrev=newItem;
        theList.itsFirst=newItem;
       
    }      
    if(!theList.itsLast)
    {
        theList.itsLast=theList.itsFirst;
    }


а где добавление элемента theList.itsFirst? нужно как то так
Код:
if(theList.itsFirst!= NULL)
    {
        theList.itsFirst->elemPrev=newItem;
        theList.itsFirst=newItem;
       
    }
        else
        {
                theList.itsFirs = newItem;
        }      
    if(theList.itsLast == NULL)
    {
        theList.itsLast=theList.itsFirst;
    }
56K
18 мая 2010 года
_EXP_
13 / / 13.05.2010
Спасибо разобрался все заработало!!
297
18 мая 2010 года
koodeer
1.2K / / 02.05.2009
Добавлю от себя советов топикстартеру.

1. Для чего список сделан двухсвязный, если его возможности не используются?

2. Список theList объявлен глобальным, между тем ссылка на него передаётся в функции. Зачем?

3. Много грамматических ошибок. Моё чувство прекрасного уязвлено.

4. Имхо, названия itsFirst и itsLast какие-то неудобоваримые. Лучше просто First и Last.

5. При завершении программы не мешало бы освободить занимаемую память.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог