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

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


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

Опубликовано

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

Опубликовано

благодарю, К.О.

Мы изучаем Си, но пишем на 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'

Опубликовано


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

И мы загрузили создателя темы =)

Опубликовано

CooDi malloc нужен для выделения памяти элементам списка. Ты просто всей программы не видел , это лишь одна функция из 7.

Опубликовано

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

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

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

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

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

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

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



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

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