Перейти к содержанию

Работа с файлами С++.


Рекомендуемые сообщения

Эта функция должна читать ранее сохраненную структуру из файла. Она читает но цикл зацикливается, потому что 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;

Ссылка на комментарий


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_o
while(!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, могу предположить, что просто читать ее содержимое из файла, скорее всего, неправильно

Ссылка на комментарий

Нормально, все на самом деле читает не в этом проблема, но функция feof которая должна возвращать true если файл кончился, не возвращает его, тем самым цикл считывания из файла не останавливается. Вот в чем дело.

while(!feof(p_file)) Все равно зацикливается.

Ссылка на комментарий

учимся курить маны...

Во первых:

в 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 может вести себя иначе.

Ссылка на комментарий

The_IceМы изучаем Си, но пишем на VS2008C++, true и false работают, суть не в этом, feof возвращает всегда 0, я проверял.

Ну ясен пень я не просто скопировал код, у меня другой указатель на файл.

Проверю как ведет себя... он

PS: Да все поменял режим с r+b на rb работает хорошо! Спасибо большое!

Ссылка на комментарий


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_o
while(!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".

Ссылка на комментарий

ЗЫ: если пишите на С, то пишите на С, т.е. расширения ставьте ".c", а не ".cpp".

Солидарен - это не путь джедая, писать на С и сохранять как "CPP".

Даже и пофиг на компиляторы, это просто не круто )

Ссылка на комментарий
The_Ice

а компилятору срр пофиг С это или С++, у С++ по стандарту совместимость с С.

в стандарте С нет понятий true и false. Если так рассуждать, то можно и new использовать, пофиг же

Ссылка на комментарий

The_Ice

ксатит true и false в С++ тоже нету. Могут быть константы или препроцессором определены, но тут С++ не отличается от С - есть 0 (ложь) и есть остальное (истина).

new использовать можно. Я не знаю зачем malloc использовали. ИМХО его есть смысл использовать только если есть необходимость в realloc. В данном случае удобнее new, как и рекомендуется в С++.

Ссылка на комментарий
new я даже не знаю что такое пока, ну надо в инете глянуть _) А free стоит в другой функции, которая кстати вызывается внутри этой. (chistka();).

Хм, значит видимо очищаемые переменные глобальны? Тоже не Айс (сорри за каламбур ))))

Ссылка на комментарий
оййопт... нее.. я в такое программирование не играю :) для этого классы с конструкторами в С++ придумали :)

А, если все-таки, на секунду представить, что программа пишется на С, а не на С++ - сразу станет очевидно, что про классы и операторы new/delete можно забыть. "Ты просто не уловил мессадж" (с)

Ссылка на комментарий

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...