Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> непонятная вещь с функцией (Си), прога циклится непонятно из-за чего 
:(
    Опции темы
AcetoN
Дата 9.1.2008, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 27.5.2007

Репутация: 1
Всего: 1



Здравствуйте господа уважаемые программеры!
Пишу курсач на тему списков. Имеется список неких (целого типа) элементов. Используя двусвязный (двунаправленный) линейный список, хочу сделать элементарную казалось бы вещь: вывести список из файла на экран. Файл текстового типа и содержит след. записи:
Код

1
2
3
4
5
6
7
8
9
0

В итоге программа выдаст строку 
Код

Spisok >>> 1 2 3 4 5 6 7 8 9 0


Текст программы

Код

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>

#define list struct list

list {
    int name; //pole so znacheniem elementa
    list *prev, *next, *start, *last; //uk-li na pred, sled. i nach. elementi spiska
};

list *prntr (list *p, list *start) {
    p=start;
    printf("\nSpisok >>> ");
    while(p!=NULL) {
        printf("%d ", p->name);
        p=p->next;
    }
    return p, start;
}

list *open (list *last) {
//list *open (list *last) {
    list *p, *start;
    FILE *f;
    char filename[50];
        start=NULL;
        last=NULL;
    do {
        clrscr();
        printf("Enter path to file to open (ex. C:\\file.txt):\n");
        scanf("%s", filename);
        f=fopen(filename, "r");
        if (f==NULL)
            {printf("(!) Invalid filename!"); getch(); }
        //printf("File readed succesfully!\n");
    }
    while(f==NULL);
    while (!feof(f)) {
            p=(list*)malloc(sizeof(list));
            fscanf(f, "%d", &(p->name));
            p->prev=last;
            p->next=NULL;
            if(last!=NULL)
                last->next=p;
            last=p;
            if(start==NULL) start=last;
        }
        fclose(f);
        printf("File readed succesfully! Press any key...");
        getch();
        return last;
}

void main() {
    list *last,*p, *start;
    open(last);
    getch();
    prntr(p, start);
}


Сама проблема заключается в следующем. В данном тексте программы имеется функция считывания записей из файла и последующее построение списка. Затем все добро выводится на экран. Так вот сразу после старта программы если ввести имя файла, из котрого необходимо считать данные, программа проглатывает строку и как ни в чем не бывало просит ввести ее заново. Что, собственно наводит меня на мысль что она каким-то таинственным образов циклится. Хотя первоначально у меня даже вовсе не было цикла DO-WHILE программа упорно зависала на этом участке. Помогал только CTRL+BREAK. А если просто убрать функцию считывания и сделать ее частью void main() то все работает прекрасно. Вот и прошу у вас помощи что может быть у меня не так с оформлением/написанием этой злосчастной процедурки.
P.S. Функция prntr(); работает правильно. Так же как и сами списки и их построения. В принципе дело даже до них и не доходит...
Прошу заметить что пишу на Си! Использую Borland Turbo C++ 3.0

Это сообщение отредактировал(а) AcetoN - 9.1.2008, 02:37
PM MAIL   Вверх
Sartorius
Дата 9.1.2008, 01:29 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 2
Всего: 37



без двойного слеша пробовал вводить? просто C:\file.txt
 Зы спец. символы только в литералах обрабатываются
 ЗЗЫ оч.много логических ошибок в исходнике.   smile 

Это сообщение отредактировал(а) Sartorius - 9.1.2008, 01:34
PM MAIL ICQ   Вверх
AcetoN
Дата 9.1.2008, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 27.5.2007

Репутация: 1
Всего: 1



Sartorius, все компилится без ошибок! не важно что я ввожу, при неправильном вводе должно последовать сообщение что имя файла неправильно
Код

if (f==NULL)
            {printf("(!) Invalid filename!"); getch(); }


PM MAIL   Вверх
Earnest
Дата 9.1.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: нет
Всего: 183



Цитата(AcetoN @  9.1.2008,  03:33 Найти цитируемый пост)
Sartorius, все компилится без ошибок!

Это по-твоему гарантирует правильность кода?
Цитата(AcetoN @  9.1.2008,  02:16 Найти цитируемый пост)
Что, собственно наводит меня на мысль что она каким-то таинственным образов циклится. 

Берешь отладчик и идешь по шагам. Проверяешь по дороге все переменные. Если будешь гадать, так с тайнами и останешься.
И подумай еще раз над тем, что тебе написал Sartorius


--------------------
...
PM   Вверх
AcetoN
Дата 9.1.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 27.5.2007

Репутация: 1
Всего: 1



Цитата("Earnest")

Это по-твоему гарантирует правильность кода?
 конечно же нет

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

Если прервать программу то она останавливается на строке scanf("%d", &filename);
PM MAIL   Вверх
JackYF
Дата 9.1.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Цитата(AcetoN @  9.1.2008,  10:41 Найти цитируемый пост)
я к сожалению не знаю как работает отлдачик

настоятельно советую разобраться.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 9.1.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(AcetoN @  9.1.2008,  01:16 Найти цитируемый пост)
проглатывает строку и как ни в чем не бывало просит ввести ее заново.

А "invalid file name" выводит?

Сделай так:
Код

    do {
        //clrscr();
        printf("Enter path to file to open (ex. C:\\file.txt):\n");
        scanf("%s", filename);
        printf("filename = %s", filename);
        f=fopen(filename, "r");
        printf("f = 0x%x", f);
        if (f==NULL)
            {printf("(!) Invalid filename!\n"); }
        //printf("File readed succesfully!\n");
    }
    while(f==NULL);

Может быстрее найдёшь ошибку.


Цитата(Sartorius @  9.1.2008,  01:29 Найти цитируемый пост)
без двойного слеша пробовал вводить? просто C:\file.txt

А с чего ты взял, что он вводит с двойным слэшом?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
0lmer
Дата 9.1.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 3.12.2006

Репутация: нет
Всего: -1



Цитата(AcetoN @  9.1.2008,  01:16 Найти цитируемый пост)
list {    int name; //pole so znacheniem elementa    list *prev, *next, *start, *last; //uk-li na pred, sled. i nach. elementi spiska};


А зачем в каждом элементе структуры хранить указатели на первый и последний???


Цитата(AcetoN @  9.1.2008,  01:16 Найти цитируемый пост)
return p, start;

А так разве можно?

Когда я делал нечто подобное со списками у меня прога висла если в конце файла был перевод строки, поэтому пришлось замутить свой признак конца файла (нечто типа ({[<"___THE___END___">]}) после всех данных).

 smile //переходи на DevC++, ИМХО намного лучше турбо

PM   Вверх
AcetoN
Дата 9.1.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 27.5.2007

Репутация: 1
Всего: 1



archimed7592, инвалид не выводит

0lmer, у меня в конце файла не стоит перевод строки (кстати с ним вместо 10 записей считывется 11, вида "45764")
Согласен, start можно и не возвращать, но так ведь программа работает, если не оформлять ее как функцию, проблема именно в оформлении оной, с этим у меня туго...
PM MAIL   Вверх
archimed7592
Дата 9.1.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(AcetoN @  9.1.2008,  17:16 Найти цитируемый пост)
archimed7592, инвалид не выводит

Ок. Ты вставил мой код? Покажи, что вводишь и что выводит(дословно). Заметь, что clrscr я закомментировал.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
AcetoN
Дата 9.1.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 27.5.2007

Репутация: 1
Всего: 1



Цитата(archimed7592 @ 9.1.2008,  17:34)
Цитата(AcetoN @  9.1.2008,  17:16 Найти цитируемый пост)
archimed7592, инвалид не выводит

Ок. Ты вставил мой код? Покажи, что вводишь и что выводит(дословно). Заметь, что clrscr я закомментировал.

Вставил, вот что пишет
Код

Enter path to file to open (ex. C:\file.txt):
fgfg
filename = fgfgEnter path to file to open (ex. C:\file.txt):
123
filename = 123Enter path to file to open (ex. C:\file.txt):
d:\file.txt
filename = d:\file.txtEnter path to file to open (ex. C:\file.txt):


D:\file.txt - реальный файл

Это сообщение отредактировал(а) AcetoN - 9.1.2008, 19:09
PM MAIL   Вверх
archimed7592
Дата 9.1.2008, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Разберись, почему не отрабатывает эта строка:
Цитата(archimed7592 @  9.1.2008,  15:05 Найти цитируемый пост)
        printf("f = 0x%x", f);



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
AcetoN
Дата 9.1.2008, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 27.5.2007

Репутация: 1
Всего: 1



Цитата(archimed7592 @ 9.1.2008,  19:17)
Разберись, почему не отрабатывает эта строка:
Цитата(archimed7592 @  9.1.2008,  15:05 Найти цитируемый пост)
        printf("f = 0x%x", f);

Да, разобраться-то оно дело хорошее, знать бы как...
Я тут еще поковырялся и вот что заметил, если сменить расширение исходника с *.C на *.CPP то происходит маленькое чудо, файл начинает открываться, появляется сообщение о неправильности имени, и наконец программа уже даже читает записи из файла! Еще немного повозившись, я наконец довел это до ума. Но блин, непонятно же, как оно так? Неужели все настолько от расширения зависит?

Код

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

#define list struct list

list {
    int name; //pole so znacheniem elementa
    list *prev, *next, *start, * last; //uk-li na pred, sled. i nach. elementi spiska
};

list *open (list *start, list *last) {
    list *p;
    FILE *f;
    char filename[50];
        start=NULL;
        last=NULL;
        clrscr();
        printf("Enter path to file to open (ex. C:\\file.txt):\n");
        scanf("%s",filename);
        f=fopen(filename, "r");
        if((f=fopen(filename, "r"))==NULL) {
            printf("(!) Invalid filename!");
            getch();
            exit(0);
        }
        else {
            //printf("File readed succesfully!\n");  getch();
            while (!feof(f)) {
                p=(list*)malloc(sizeof(list));
                fscanf(f, "%d", &(p->name));
                p->prev=last;
                p->next=NULL;
                if(last!=NULL)
                    last->next=p;
                last=p;
                if(start==NULL) start=last;
            }
                fclose(f);
        }
        printf("File readed succesfully! Press any key...");
        getch();
        return last, p, start;
}

list *prntr (list *p, list *start) {
    int i;
    p=start;
    printf("\nSpisok >>> ");
    while(p!=NULL) {
        printf("%d ", p->name);
        p=p->next;
    }
    return p, start;
}

list *prntl (list *p, list *last) {
    p=last;
    printf("\nSpisok <<< ");
    while(p!=NULL) {
        printf("%d ", p->name);
        p=p->prev;
    }
    return p, last;
}

void main() {

list *last;
list *p, *start;
int i,n, newn,ans;
last=NULL;
clrscr();

start=open(last, start);
prntr(p, start);
getch();


Это сообщение отредактировал(а) AcetoN - 9.1.2008, 22:20
PM MAIL   Вверх
archimed7592
Дата 9.1.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(AcetoN @  9.1.2008,  22:14 Найти цитируемый пост)
Неужели все настолько от расширения зависит?

Нет, конечно.

Цитата(AcetoN @  9.1.2008,  22:14 Найти цитируемый пост)
        f=fopen(filename, "r");
        if((f=fopen(filename, "r"))==NULL) {

Зачем файл два раза открываешь?



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
AcetoN
Дата 9.1.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 27.5.2007

Репутация: 1
Всего: 1



Цитата(archimed7592 @ 9.1.2008,  22:20)
Цитата(AcetoN @  9.1.2008,  22:14 Найти цитируемый пост)
        f=fopen(filename, "r");
        if((f=fopen(filename, "r"))==NULL) {

Зачем файл два раза открываешь?

баги...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0859 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.