Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите, господа программисты / 19 сообщений из 19, страница 1 из 1
05.02.2007, 16:06
    #34306933
Помогите, господа программисты
Добрый день. Прошу консультацию.
Задача: Зашифровать DBF файл, реализация алгоритма есть, и текстовые файлы шифруются «на ура». Но! Возникла проблема с DBF файлами.
Есть файл, условно назовем его A. DBF, не могу элементарно скопировать его побайтно в файл GOOD.DBF
Делаю так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
void _GetFile(ParamBlk FAR *parm)
{
   	string sErr;
	char  * cerr;
	char szFile[ 255 ];
	 LoadReferC(p( 0 ).loc,szFile); //  в szFile имя файла
	long iLen= 0 ;
	try
	{
		ifstream iFile(szFile, ifstream::in  | ifstream::binary );
		ofstream oFile("D:\\GOOD.DBF",  ofstream::binary );
		if (!iFile.is_open() )  throw (ifstream::failure("Error Open File"));
    
  	    char  cbyte=0x00;
   	  while (! iFile.eof()) 
		  {
		  cbyte = iFile.get();
		  oFile<<cbyte;
		  }

  iFile.close();
  oFile.close();

   	} catch (ifstream::failure error  ) 
		{ 
		sErr = error.what();
		iLen = sErr.size()+ 1 ;
		cerr = new char [iLen];
		strcpy (cerr, sErr.c_str());
	  	   SaveDataToRef(&p( 1 ).loc,cerr); 
		_RetLogical((int) FALSE);
		}



delete [ ] cerr;
}
После копирования :
1) На 1 байт больше;
2) Среда Visual Foxpro говорит мне что файл поврежден. И это только в том случае если DBF хотя бы одну запись.
3) Привожу скрины файлов ( сам не врублюсь че не нравиться )

Исходный файл, открываеться:
...
Рейтинг: 0 / 0
05.02.2007, 16:16
    #34306972
Помогите, господа программисты
Его НЕX:
...
Рейтинг: 0 / 0
05.02.2007, 16:21
    #34307001
Помогите, господа программисты
Вот НЕX копии:
Откуда FF берется так же не понятно.
...
Рейтинг: 0 / 0
05.02.2007, 16:23
    #34307005
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, господа программисты
Иван Иванович пишет:

> Задача: Зашифровать DBF файл, реализация алгоритма есть, и текстовые

Вообще-то готовые библиотеки для шифрования DBF для FoxPro
есть еще со времен DOS-а. Может вам подойдут ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
05.02.2007, 16:25
    #34307017
Помогите, господа программисты
MasterZiv, нет, не подойдут. Иначе не спрашивал бы.
...
Рейтинг: 0 / 0
05.02.2007, 17:12
    #34307178
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, господа программисты
Код: plaintext
1.
2.
3.
4.
5.
    while (! iFile.eof()) 
  {
  cbyte = iFile.get();
  oFile<<cbyte;
  }

Проверять лень, но, скорее всего, дело в следующем. iFile устанавливает признак конца
файла не при чтении последнего байта, а при попытке чтения за концом файла. Я бы сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
    while (! iFile.eof()) 
  {
  cbyte = iFile.get();
  if (iFile.eof()) break;
  oFile<<cbyte;
  }
...
Рейтинг: 0 / 0
05.02.2007, 17:17
    #34307196
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, господа программисты
1. Текстовый файл, прогнанный через эту программу, не меняется? Не верю.

2. Чтение из файла — get(), запись — <<
Это правильно?

3. Не нравится char cbyte; хотелось бы unsigned char.

Хотя это всё может быть и не о том.
...
Рейтинг: 0 / 0
05.02.2007, 17:23
    #34307226
Помогите, господа программисты
Ой Вэй, файл меняется, разница в 1 байт, как видно из скрина.
Сделал еще проще ( как отбойны молоток)
Код: plaintext
while (!iFile.eof())   oFile.put( iFile.get() ) ;
Но меня терзают смутные сомнения, что что-то с флагами чтения -записи из фалового потока ввода вывода.
...
Рейтинг: 0 / 0
05.02.2007, 17:28
    #34307240
Помогите, господа программисты
ФаЙлового :)
...
Рейтинг: 0 / 0
05.02.2007, 17:32
    #34307254
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, господа программисты
Сделай как я сказал:)
Код: plaintext
1.
2.
3.
4.
5.
6.
   while (! iFile.eof()) 
  {
  cbyte = iFile.get();
  if (iFile.eof()) break;
  oFile<<cbyte;
  }
...
Рейтинг: 0 / 0
05.02.2007, 17:38
    #34307273
Помогите, господа программисты
Hryuckinnen , не прокатило. Все равно на 1 байт больше получается. Откуда-то берется байт FF в самом конце фала после байта окончания файла. Даже если его стереть в ручную, получается полная копия исходного файла, который (исходный) открывается, но среда Visual Foxpro видит какой-то "косяк", хотя и понимает, что это именно файл DBF.
...
Рейтинг: 0 / 0
05.02.2007, 17:50
    #34307332
Помогите, господа программисты
Тут вообще странность. Если в файле нет ни одной записи ( просто заголовок таблицы) то все ОК. А если присутствует хотяды 1 запись, то при открытии лезет:
...
Рейтинг: 0 / 0
05.02.2007, 17:54
    #34307351
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, господа программисты
Проверил у себя в 6-м Билдыре. FF возвращается методом iFile.get(). Даже если входной файл не существует, iFile.get () возвращает FF. Также проверил на предмет того, что будет, если сначала читать, потом проверять на eof (), а потом, если не eof (), то записывать. Реально при этом FF в выходной файлик не попадает. Совет: убивай выходной файлик перед тем, как пробовать.
...
Рейтинг: 0 / 0
05.02.2007, 17:57
    #34307366
Помогите, господа программисты
Hryuckinnen, спасибо. А не подскажете как его (новый) создать средствами iostream для чтения и записи или другим методом ?
...
Рейтинг: 0 / 0
05.02.2007, 18:06
    #34307398
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, господа программисты
автор
А не подскажете как его (новый) создать средствами iostream для чтения и записи или другим методом ?

Вообще-то ofstream сам создает файлик, если его нет, при вызове метода open (filename, ios_base::out) или при вызове конструктора с теми же параметрами.
...
Рейтинг: 0 / 0
05.02.2007, 18:14
    #34307422
Помогите, господа программисты
Hryuckinnen, создает. Проверил. Но не полную копию.
Сделал так :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
void _GetFile(ParamBlk FAR *parm)
{
    char szIFile[ 255 ];
	char szOFile[ 255 ];

	LoadReferC(p( 0 ).loc,szIFile);
	LoadReferC(p( 1 ).loc,szOFile);

	try
	{
		ifstream iIFile(szIFile, ifstream::in  | ifstream::binary );
		ofstream oFile(szOFile,  ofstream::binary );
		if (!iIFile.is_open() )  throw (ifstream::failure("Error Open File"));
    
     	  while (!iIFile.eof())
		  {
			  if (iIFile.eof()) break;
			  oFile.put( iIFile.get() ) ;
		  }
		 
                           iIFile.close();
                           oFile.close();

   	} catch (ios::failure error ) 
		{ 
		string sErr = error.what();
		char* cerr = new char [sErr.size()+ 1 ];
		strcpy (cerr, sErr.c_str());
	             SaveDataToRef(&p( 2 ).loc,cerr); 
		 delete [ ] cerr;
		_RetLogical((int) FALSE);
		}
}
Все равно пишет что файл поврежден. Вообще не врублюсь что за фигня.
...
Рейтинг: 0 / 0
05.02.2007, 18:19
    #34307435
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, господа программисты
Эт неправильно:

Код: plaintext
1.
2.
3.
4.
5.
while (!iIFile.eof())
{
  if (iIFile.eof()) break;
  oFile.put( iIFile.get() ) ;
}

Надо так:

Код: plaintext
1.
2.
3.
4.
5.
6.
while (!iIFile.eof())
{
  char c = iIFile.get();
  if (iIFile.eof()) break;
  oFile.put(c) ;
}
...
Рейтинг: 0 / 0
05.02.2007, 18:28
    #34307456
Помогите, господа программисты
Да! Спасибо ! Выручил.
...
Рейтинг: 0 / 0
05.02.2007, 18:41
    #34307478
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, господа программисты
Всегда пожалуйста;)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите, господа программисты / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]