Форум программистов, компьютерный форум CyberForum.ru

Бинарные файлы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
B_izo_n
0 / 0 / 0
Регистрация: 10.12.2008
Сообщений: 20
12.02.2010, 23:22     Бинарные файлы #1
Всем добрый день/вечер/ночь!
У меня такой вопрос.
Создал структуру и записал в файл. При записи в пошаговом режиме - все нормально. Размер файла соответсвует размеру структуры(записываю три штуки) но при чтении из файла функция fread считывает лишнюю пустую структуру. Года три назад я писал такую же прогу и было тоже самое, но я решил эту проблему но сейчас не помню как. Если кто-то знает подскажите как. Уменя времени в обрез. Ооочень надо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2010, 23:22     Бинарные файлы
Посмотрите здесь:

C++ Бинарные файлы
Бинарные файлы c++ C++
бинарные файлы, C++ C++
Бинарные файлы C++
бинарные файлы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
13.02.2010, 00:20     Бинарные файлы #2
может быть типичная ошибка, которая исправляется проверкой не прочитан ли конец фйла зразуже после чтения из файла
если да то такой вариант должен роботать
for(i=0;!feof(f);i++)
C
1
2
3
4
5
6
7
  {
fread(*namestruct,sizeof(struct)*i,1,0)  //после считивания смещается указатель/курсор в файле
    if(feof(f))         //преверка непрочитан ли символ конца файла    
      break;
.....
// вывод
  }
B_izo_n
0 / 0 / 0
Регистрация: 10.12.2008
Сообщений: 20
13.02.2010, 00:29  [ТС]     Бинарные файлы #3
Цитата Сообщение от лендер Посмотреть сообщение
может быть типичная ошибка, которая исправляется проверкой не прочитан ли конец фйла зразуже после чтения из файла
если да то такой вариант должен роботать
for(i=0;!feof(f);i++)
C
1
2
3
4
5
6
7
  {
fread(*namestruct,sizeof(struct)*i,1,0)  //после считивания смещается указатель/курсор в файле
    if(feof(f))         //преверка непрочитан ли символ конца файла    
      break;
.....
// вывод
  }
Да конечно я пробовал if(feof(f))break;, но результат тот-же. Еще вопрос : fread(*namestruct,sizeof(struct)*i,1,0) а что это за параметр 0 в функции fread?
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
13.02.2010, 01:06     Бинарные файлы #4
Видимо, вместо "0" должно быть "f"
И еще - для определения конца файла лучше проверять fread(...) < 1
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
13.02.2010, 01:52     Бинарные файлы #5
а точно наоко писал... но смысл ясен
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.02.2010, 02:15     Бинарные файлы #6
B_izo_n, была похожая заморочка со структурами и двоичными файлами. Посмотрите, может пригодится что...
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1330 / 863 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
13.02.2010, 02:16     Бинарные файлы #7
B_izo_n, Может вы покажите как производится запись и чтение.. (и саму структуру тоже)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2010, 12:33     Бинарные файлы
Еще ссылки по теме:

Бинарные файлы C++
C++ Бинарные файлы в С++
C++ Бинарные файлы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
B_izo_n
0 / 0 / 0
Регистрация: 10.12.2008
Сообщений: 20
13.02.2010, 12:33  [ТС]     Бинарные файлы #8
Цитата Сообщение от ISergey Посмотреть сообщение
B_izo_n, Может вы покажите как производится запись и чтение.. (и саму структуру тоже)
Вот моя структура и функции записи и чтения (извиняюсь за большой код):
Код
struct Tel_Book
{
Tel_Book *pPrev,*pNext;
int num;
char first_name[27];
int in_year;
char tel_number[20];
friend ostream& operator <<(ostream& os, const Tel_Book &tbook);
};
вот запись:
Код
pCur=pHead;
if(addnew)
{//1
cout<<endl<<"Save to File? y/n";
set=getch();
if(set==121||set==89||set==-83||set==-115)//if Yes
 {//2
if(exists)
basa=fopen("../Basa.tel","a+b");
if(!exists)
basa=fopen("../Basa.tel","w+b");
if(basa==NULL)
  {//3
cout<<endl<<"Can't open file";
break;//выхожу из case
  }//3
 while(pCur)
   {//4
fwrite(pCur,sizeof(Tel_Book),1,basa);
pCur=pCur->pNext;
   }//4
А вот чтение:
Код
bool a;
FILE *F;
if((F=fopen("../Basa.tel","rb"))==NULL)
a=false;
else
{
t_book=new Tel_Book;
fread(t_book,sizeof(Tel_Book),1,F);
pHead=pCur=t_book;
pHead->pNext=pHead->pPrev=NULL;
while(!feof(F))
  {
t_book=new Tel_Book;
fread(t_book,sizeof(Tel_Book),1,F);
t_book->pNext=NULL;
t_book->pPrev=pCur;
pCur->pNext=t_book;
pCur=t_book;
t_book=NULL;
  }
}
fclose(F);
пробовал в цикле вставлять переьенную char и проверял на '\0'
ну например:
char f;
while(!feof(F))
{
fread(f,sizeof(char),1,F);
if(f=='\0')
break;
fseek(F,-sizeof(char),1);
.............читаем далее
}
вышел из ситуации удалением последнего считанного объекта:
pCur=t_book->pPrev;
pCur->pNext=NULL;
delete t_book;
t_book=NULL;
Но ... вопрос остается открытым.
интересно знать, на что же нужно проверять последний символ.
Yandex
Объявления
13.02.2010, 12:33     Бинарные файлы
Ответ Создать тему
Опции темы

Текущее время: 22:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru