Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Проблема с двоичными файлами в C++

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Проблема с двоичными файлами в C++
Имя
Сообщение << Старые топики   Новые топики >>
Проблема с двоичными файлами в C++ - 2008-11-25 00:31:13.876666   
Podzher

Сообщений: 2
Оценки: 0
Присоединился: 2008-11-24 23:54:24.673333
Доброе время суток!:)
Господа, есть задачка:
В середину двоичного файла целого типа поместить элементы этого файла, кратные пяти.
Ниже предствлен листинг моей программы. Вопрос заключается в следующем: При выводе а экран компьютер выдаёт последний элемент дважды. Подскажите, в чём может быть проблема.:)
#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;
# include <stdlib.h>
#include <time.h>
#define count 10

class bin_stream: public fstream // Переопрделяю класс fstream для записи\чтения в двоичный файл переменных различного типа
{ public:
bin_stream(const char *str): fstream(str, ios::out | ios::in | ios::binary | ios::trunc) {}
void doneOurDate(const void*, int, int);
bin_stream &operator<<(int d)
{ doneOurDate(&d, sizeof(d),0);
return *this;
}
bin_stream &operator>>(int &d)
{ doneOurDate(&d, sizeof(d),1);
return *this;
}
};
int main()
{ int i, d, j=0, k = 0;
time_t t;
srand(time(&t)); // инициализировать генератор случайных чисел
bin_stream bin_out("Bin.bin"); //исходный файл
bin_stream bin_in("Bin2.bin"); //Конечный файл
if (!bin_out && !bin_in)
{ cerr << "Unable to write to Bin.dat" << endl;
exit(1);
}
for ( i = 0; i < count; i++ ) // Запись в исходный файл произвольных значений
{ d = rand() % 100;
cout << setw( 3 )<< d;
bin_out << d;
}
bin_out.seekg( 0, ios::beg ); // Вывод на экран первый файл
cout << endl;
for( i = 0; i<count; i++ )
{
bin_out >> d;
cout << setw( 3 ) << d;
j++;
}
cout << endl;
bin_out.seekg( 0, ios::beg );
for( i=0; i<( int )( j/2 ); i++ ) // Запись половины исходного файла во второй файл
{ bin_out >> d;
bin_in << d;
// cout << setw( 3 ) << d;
}
bin_out.seekg( 0, ios::beg );
for( i = 0; i<count; i++ ) // Запись во второй фал чисел из первого файла кратные 5
{

bin_out >> d;
if( d % 5 == 0 )
{
bin_in << d;
k++;
}
}
bin_out.seekg( 0 , ios::beg );
for( i = 0; i< count; i++ ) // Запись во второй файл значений первого файла, находящихся во второй половине
{ bin_out >> d;
if ( i>( int )( count/2 ) - 1 ){ bin_in << d; }
}
bin_in.seekg( 0, ios::beg );
while( !bin_in.eof() ) // Вывод второво файла
{ bin_in >> d;
cout << setw( 3 ) << d;
}
return 0;
}

void bin_stream:: doneOurDate(const void *Ptr, int len, int sign) // Приведение различных типов к char
{ if (!Ptr) return;
if (len <= 0) return;
if (sign==0) write((char*)Ptr, len);
else read((char*)Ptr, len);
}


p.s Заранее спасибо!:)
Post #: 1
RE: Проблема с двоичными файлами в C++ - 2008-11-25 04:26:18.496666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Юзай тэг code и нормально форматируй исходник… Лень даже его копировать и открывать.
Post #: 2
RE: Проблема с двоичными файлами в C++ - 2008-11-25 14:05:17.086666   
tt_andrey

Сообщений: 213
Оценки: 0
Присоединился: 2007-07-03 13:54:36.440000
while( !bin_in.eof() ) // Вывод второво файла { &nbsp; bin_in &gt;&gt; d; &nbsp; //* &nbsp; cout &lt;&lt; setw( 3 ) &lt;&lt; d; }
Вот между этими двумя строчками(я ее пометил звездочкой) после вызова bin_in >> d файл получает состояние EndOfFile и при вызове cout << d записывает в выходной поток то значение d, которое было получено еще на предыдущей итерации, и только потом выходит.

Как вариант такой цикл можно заменить на
bin_in &gt;&gt; d; while( !bin_in.eof() ) // Вывод второво файла { &nbsp;&nbsp;&nbsp; cout &lt;&lt; setw( 3 ) &lt;&lt; d; &nbsp;&nbsp;&nbsp; bin_in &gt;&gt; d; }
Post #: 3
RE: Проблема с двоичными файлами в C++ - 2008-11-25 18:02:30.443333   
Podzher

Сообщений: 2
Оценки: 0
Присоединился: 2008-11-24 23:54:24.673333
Спасибо Огромное!!! Теперь всё нормально работает!:)
Post #: 4
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Проблема с двоичными файлами в C++







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.