Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2015, 18:06   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
Печаль Односвязные списки

Не могу понять в чем проблема

В файле C:\\TextFile.txt записал одно число 10

Кидаю это число в список

Из списка при этом получаю 2 элемента, когда эго читаю

10

10

В чем проблема ?

Поздно выходим из цикла считыввния данных из файла ?

Код:

#include <conio.h>
#include <stdio.h>
#include <iostream.h>

struct node

{
	int inf;

	node *next;
};

void main()

{

	node *r, *fr = NULL, *er;

	node *rp;  int a;

	clrscr();

	FILE *f;

	f = fopen("C:\\TextFile.txt","r");

	do

	{

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

		r = new node;

		r->inf = a;

		r->next = NULL;

		if (fr == NULL) fr = r;

		er -> next = r;

		er = r;
	}

	while (!feof(f));

	fclose(f);

	cout << "SFORMIROVAN SPISOK:\n\n";

	r = fr;

	while (r != NULL)

	{
		cout << r -> inf << "\n";

		r = r -> next;
	}

	getch();
}
RAFA91 вне форума Ответить с цитированием
Старый 04.01.2015, 19:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Отладку, я так понимаю, не проводил?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.01.2015, 11:07   #3
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

Можно обрабатывать результат fscanf.
Дело в том, что присутствие , например символа новой строки в потоке файла еще не означает конца файла. То есть может быть символ не цифра, и при этом коде продублируется еще раз прошлое значение(a).
Там у вас в коде есть и другие нюансы, например не определения er.

Код:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;
#define getch getchar

struct node
{
    int inf;
    node *next;
};

char *files[]={"C:\\TextFile.txt","/root/text_with_num10.txt",NULL};
//echo 10 >/root/text_with_num10.txt

FILE *open_one(char *files[])
{
    FILE* fi=NULL
             ;
    int i=0;
    while (files[i]!=NULL)
    {
        fi=fopen(files[i],"r");
        if (fi) return fi;
        i++;
    }
    return NULL;
}

int main()
{
    node *r, *fr = NULL, *er;
    node *rp;
    node *last,*top;
    int a;
    //clrscr();
    FILE *f;
    er=NULL;
    last=NULL;
    top=NULL;
    //f = fopen("C:\\TextFile.txt","r");
    f=open_one(files);
    if (f==NULL)
    {
        cout<<"Error open file!";
        return 1;
    }
    do
    {
        if (fscanf(f,"%d", &a)>0)
        {
            r = new node;
            r->inf = a;
            r->next = NULL;
            if (top == NULL) top = r;
            else
            {
                last->next=r;
            }
            last=r;
        }
    }
    while (!feof(f));
    fclose(f);
    cout << "SFORMIROVAN SPISOK:\n\n";
    fr=top;

    r = fr;
    while (r != NULL)

    {
        cout << r -> inf << "\n";
        r = r -> next;
    }

    r=fr;
    while (r != NULL)
    {
        rp=r->next;
        delete r;
        r=rp;
        //r = r -> next;
    }

    getch();
    return 0;
}

Последний раз редактировалось nikolay1982; 05.01.2015 в 11:09.
nikolay1982 вне форума Ответить с цитированием
Старый 05.01.2015, 13:11   #4
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

спасибо за отзывы.
Stilet - программа работала, но последнее значение дублировалось.
Я пошел на хитрость, просто взял ненужное значение и удалил из списка.
Оно как-раз последнее в списке.
Может конечно это и тупо.
nikolay1982 в файле кроме цифры 10 больше нечего небыло.


Код:

#include <conio.h>
#include <stdio.h>
#include <iostream.h>

struct node

{

	int inf;

	node *next;
};

void main()

{

	node *r, *fr = NULL, *er, *rp;

	int a;

	clrscr();

	FILE *f;

	f = fopen("C:\\TextFile.txt","r");


	do

	{
		fscanf(f,"%d", &a);

		r = new node;

		r->inf = a;

		r->next = NULL;

		if ( fr == NULL) fr = r;

		er -> next = r;

		er = r;

	}

	while (!feof(f));

	fclose(f);

	r=fr;

	while (r->next != NULL)

	{
		rp = r;

		r = r -> next;
	}

	rp -> next = r -> next;

	delete r;

	er = rp;

	r = fr;

	while (r != NULL)

	{

		cout << r -> inf << "\n";

		r = r -> next;
	}

	getch();

	cout << "\n\n\nk = ";

	cin >> a;

	cout<<"\n\n";

	r = fr;

	while ( r!= NULL )

	{
		if ( r-> inf == a ) break;

		r = r -> next;
	}

	if ( r -> inf == a )

	cout << "ELEMENT S INFORMACII k = " << r -> inf << " NAIDEN.\n";

	else

	cout << "ELEMENT S INFORMACII k = " << a << " NE NAIDEN.\n";

	getch();

  


}
Пишу в борланде с ++

Последний раз редактировалось RAFA91; 05.01.2015 в 13:16.
RAFA91 вне форума Ответить с цитированием
Старый 05.01.2015, 17:01   #5
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

Я же пытался объяснить почему не работает(дублируется последнее значение).
Мой код вы пробывали?
nikolay1982 вне форума Ответить с цитированием
Старый 05.01.2015, 17:30   #6
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Вы думаете борланд его потянет ?
RAFA91 вне форума Ответить с цитированием
Старый 05.01.2015, 19:55   #7
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

пробуйте этот код, компилировал в borland C++ 3.1 в dosbox:

Код:
//#include <iostream>
#include <stdio.h>
#include <stdlib.h>

//using namespace std;
#define getch getchar

struct node
{
    int inf;
    node *next;
};

char *files[]={"C:\\TextFile.txt","/root/text_with_num10.txt",NULL};
//echo 10 >/root/text_with_num10.txt

FILE *open_one(char *files[])
{
    FILE* fi=NULL
             ;
    int i=0;
    while (files[i]!=NULL)
    {
        fi=fopen(files[i],"r");
        if (fi) return fi;
        i++;
    }
    return NULL;
}

int main()
{
    node *r, *fr = NULL, *er;
    node *rp;
    node *last,*top;
    int a;
    //clrscr();
    FILE *f;
    er=NULL;
    last=NULL;
    top=NULL;
    //f = fopen("C:\\TextFile.txt","r");
    f=open_one(files);
    if (f==NULL)
    {
        printf("Error open file!");
        return 1;
    }
    do
    {
        if (fscanf(f,"%d", &a)>0)
        {
            r = new node;
            r->inf = a;
            r->next = NULL;
            if (top == NULL) top = r;
            else
            {
                last->next=r;
            }
            last=r;
        }
    }
    while (!feof(f));
    fclose(f);
    printf( "SFORMIROVAN SPISOK:\n\n");
    fr=top;

    r = fr;
    while (r != NULL)
    {
        printf("\n%i",r -> inf);
        r = r -> next;
    }

    r=fr;
    while (r != NULL)
    {
        rp=r->next;
        delete r;
        r=rp;
        //r = r -> next;
    }

    getch();
    return 0;
}
nikolay1982 вне форума Ответить с цитированием
Старый 06.01.2015, 14:19   #8
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

спасибо большое!!! Ваша программа работает отлично.

В дальнейшем буду ее применять .
RAFA91 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Односвязные списки SsAn Visual C++ 0 15.05.2014 17:09
Односвязные списки SsAn Visual C++ 0 02.05.2014 17:35
Односвязные списки в с++ fuzzyduzzy Помощь студентам 8 19.01.2013 00:10
Односвязные списки. Killspamers Помощь студентам 7 19.03.2012 18:59
Односвязные списки art_stalker Общие вопросы C/C++ 5 21.04.2010 22:49