Cristian Опубликовано 6 мая, 2010 Жалоба Поделиться Опубликовано 6 мая, 2010 Эта функция должна читать ранее сохраненную структуру из файла. Она читает но цикл зацикливается, потому что feof всегда почему то возвращает 0, хотя если файл заканчивается должна вернуть 1... не могу понять в чем дело, может я че не так сделал ? Помогите, может кто знает. now=0; p=fopen("BASE.txt","r+b"); if(feof(p)!=true) { chistka(); first=(struct Sp*)malloc(sizeof(struct Sp)); fread(first,sizeof(Sp),1,p); first->next=0; now=first->next; while(feof(p)!=true) { now=(struct Sp*)malloc(sizeof(struct Sp)); fread(now,sizeof(Sp),1,p); now->next=0; now=now->next; } } else printf("Dannih v File netu!!!\n"); fclose(p); now=0; Ссылка на комментарий
The_Ice Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 struct Sp * first = 0, *now = 0, *pnt = 0 ;FILE * p_file = 0;p_file = fopen("base.txt", "rb");if( !p_file){ printf("error"); return 2;}chistka(); //O_owhile(!feof(p_file)){ pnt = (struct Sp*)malloc(sizeof(struct Sp)); if( fread(pnt, 1, sizeof(struct Sp), p_file) != sizeof(struct Sp)) { printf("error"); return 1; } p-> next = 0; if(!now) { first = now = p; }else { now-> next = p; }}fclose(p_file);Не зная описания Sp, могу предположить, что просто читать ее содержимое из файла, скорее всего, неправильно Ссылка на комментарий
Cristian Опубликовано 7 мая, 2010 Автор Жалоба Поделиться Опубликовано 7 мая, 2010 Нормально, все на самом деле читает не в этом проблема, но функция feof которая должна возвращать true если файл кончился, не возвращает его, тем самым цикл считывания из файла не останавливается. Вот в чем дело.while(!feof(p_file)) Все равно зацикливается. Ссылка на комментарий
The_Ice Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 учимся курить маны...Во первых:в C, в отличии от С++, нет булевых констант true и false: они представляются целыми числами по принципу 0 - это ложь, все остальное - это истина. TRUE и FALSE - макросы.+ я удивлен, что Ваш первоначальный код собрался и выполнился: макроса true не существует, по дефолту.Во вторых: The function feof() tests the end-of-file indicator for the stream pointed to by stream, returning non-zero if it is set. The end-of-file indicator can only be cleared by the function clearerr().Возвращает не ноль, если обнаружен конец файла. Т.е. условие feof(p) != true неверно.UPD:while(!feof(p_file)) Все равно зацикливается.Вы поменяли только условия, или копипастнули код?Если первое, то, обратите внимание, что у Вас файл открывается в режиме "rb+", а не "rb", мои маны не описывают разницу, но, могу предположить, что в режиме записи, feof может вести себя иначе. Ссылка на комментарий
Cristian Опубликовано 7 мая, 2010 Автор Жалоба Поделиться Опубликовано 7 мая, 2010 The_IceМы изучаем Си, но пишем на VS2008C++, true и false работают, суть не в этом, feof возвращает всегда 0, я проверял.Ну ясен пень я не просто скопировал код, у меня другой указатель на файл.Проверю как ведет себя... онPS: Да все поменял режим с r+b на rb работает хорошо! Спасибо большое! Ссылка на комментарий
The_Ice Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 struct Sp * first = 0, *now = 0, *pnt = 0 ;FILE * p_file = 0;p_file = fopen("base.txt", "rb");if( !p_file){ printf("error"); return 2;}chistka(); //O_owhile(!feof(p_file)){ pnt = (struct Sp*)malloc(sizeof(struct Sp)); if( fread(pnt, 1, sizeof(struct Sp), p_file) != sizeof(struct Sp)) { free(pnt); continue; } pnt-> next = 0; if(!now) { first = now = pnt; }else { now-> next = pnt; }}fclose(p_file); что ж, пришлось собрать... и чуток подправитьЗЫ: если пишите на С, то пишите на С, т.е. расширения ставьте ".c", а не ".cpp". Ссылка на комментарий
CooDi Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 The_Iceа компилятору срр пофиг С это или С++, у С++ по стандарту совместимость с С. Ссылка на комментарий
L0K1 Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 ЗЫ: если пишите на С, то пишите на С, т.е. расширения ставьте ".c", а не ".cpp".Солидарен - это не путь джедая, писать на С и сохранять как "CPP".Даже и пофиг на компиляторы, это просто не круто ) Ссылка на комментарий
The_Ice Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 The_Iceа компилятору срр пофиг С это или С++, у С++ по стандарту совместимость с С.в стандарте С нет понятий true и false. Если так рассуждать, то можно и new использовать, пофиг же Ссылка на комментарий
CooDi Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 The_Iceксатит true и false в С++ тоже нету. Могут быть константы или препроцессором определены, но тут С++ не отличается от С - есть 0 (ложь) и есть остальное (истина).new использовать можно. Я не знаю зачем malloc использовали. ИМХО его есть смысл использовать только если есть необходимость в realloc. В данном случае удобнее new, как и рекомендуется в С++. Ссылка на комментарий
The_Ice Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 благодарю, К.О.Мы изучаем Си, но пишем на VS2008C++echo 'void main(){char *p = new char[2]; return 0;}' > test.c && gcc ./test.c -o test && echo 'can use new' || echo 'cant use new' Ссылка на комментарий
L0K1 Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 echo 'void main(){char *p = new char[2]; return 0;}' > test.c && gcc ./test.c -o test && echo 'can use new' || echo 'cant use new'gcc -Wall -pedantic test.c -o testИ мы загрузили создателя темы =) Ссылка на комментарий
Cristian Опубликовано 7 мая, 2010 Автор Жалоба Поделиться Опубликовано 7 мая, 2010 CooDi malloc нужен для выделения памяти элементам списка. Ты просто всей программы не видел , это лишь одна функция из 7. Ссылка на комментарий
CooDi Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 Cristianпочему new нельзя использовать? А где free стоит, если в этой функции оно отсутствует? Ссылка на комментарий
Cristian Опубликовано 7 мая, 2010 Автор Жалоба Поделиться Опубликовано 7 мая, 2010 new я даже не знаю что такое пока, ну надо в инете глянуть _) А free стоит в другой функции, которая кстати вызывается внутри этой. (chistka(). Ссылка на комментарий
L0K1 Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 new я даже не знаю что такое пока, ну надо в инете глянуть _) А free стоит в другой функции, которая кстати вызывается внутри этой. (chistka().Хм, значит видимо очищаемые переменные глобальны? Тоже не Айс (сорри за каламбур )))) Ссылка на комментарий
CooDi Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 оййопт... нее.. я в такое программирование не играю для этого классы с конструкторами в С++ придумали Ссылка на комментарий
The_Ice Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 оййопт... нее.. я в такое программирование не играю для этого классы с конструкторами в С++ придумали А, если все-таки, на секунду представить, что программа пишется на С, а не на С++ - сразу станет очевидно, что про классы и операторы new/delete можно забыть. "Ты просто не уловил мессадж" (с) Ссылка на комментарий
Cristian Опубликовано 7 мая, 2010 Автор Жалоба Поделиться Опубликовано 7 мая, 2010 мы изучаем Си, никаких классов и конструкторов... ) Ссылка на комментарий
The_Ice Опубликовано 7 мая, 2010 Жалоба Поделиться Опубликовано 7 мая, 2010 В топике, кстате, упоминается С++, а не С - неужто непонятки из-за этого?! Ссылка на комментарий
Cristian Опубликовано 7 мая, 2010 Автор Жалоба Поделиться Опубликовано 7 мая, 2010 Ну да моя вина ) Просто пишем же на VSC++ вот и привык ) Ссылка на комментарий
Рекомендуемые сообщения
Пожалуйста, войдите, чтобы комментировать
Вы сможете оставить комментарий после входа в
Войти