Поиск:

Ответ в темуСоздание новой темы Создание опроса
> каким компонентом считать файлы для сравнения, открытие файлов для сравнения 
:(
    Опции темы
Dreamuchiy
Дата 21.5.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 26.12.2006

Репутация: нет
Всего: -1



Нужно открыть 2 файла и сравнить содержимое и длину друг с другом,
и так чтобы сравнение происходило по байтам споследующим выводом содержимого в HEX или DEC виде на форму?
Проще говоря как открыть файл и считать из него байт в переменную?

--------------------
Мечтаю написать в карман Биллу Гейтсу... Или как минимум посмотреть крах Майкрософт...
PM MAIL   Вверх
RatHat
Дата 22.5.2007, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: -1
Всего: 1



проще руками написать, чем компоненты искать. По крайней мере, будешь точно знать, как оно работает)
считываешь файлы в две переменные, например, типа String, а потом просто по циклу прогоняешь...
Чтобы длину сравнить :
Код

String file1, file2;
//Тут загоняешь тексты файлов в переменные file1 и file2;
...
...
long l1, l2, diff;
l1 = file1.length();
l2 = file2.length();
diff = l1 - l2;
if(diff == 0)
{
    //тут пишешь, что делать, если длина у файлов одинаковая
}
else
{
    //тут пишешь, что делать, если длина у файлов разная
}
...

и всё в таком ключе
Если хочешь, напишу полный код, но в чём тогда будет интрига smile
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
sp75
Дата 22.5.2007, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 17.5.2007

Репутация: 1
Всего: 1



Цитата(RatHat @ 22.5.2007,  00:32)
проще руками написать, чем компоненты искать. По крайней мере, будешь точно знать, как оно работает)
считываешь файлы в две переменные, например, типа String, а потом просто по циклу прогоняешь...
Чтобы длину сравнить :
Код

String file1, file2;
//Тут загоняешь тексты файлов в переменные file1 и file2;
...
...
long l1, l2, diff;
l1 = file1.length();
l2 = file2.length();
diff = l1 - l2;
if(diff == 0)
{
    //тут пишешь, что делать, если длина у файлов одинаковая
}
else
{
    //тут пишешь, что делать, если длина у файлов разная
}
...

и всё в таком ключе
Если хочешь, напишу полный код, но в чём тогда будет интрига smile

String не пройдет для всего, говоря попроще, только для текстовых файлов.
Надежно и для любых файлов будет вот так:

  TMemoryStream *File1_Stream , *File2_Stream ;

  File1_Stream = new TMemoryStream(); 
  File2_Stream = new TMemoryStream(); 

  File1_Stream->LoadFromFile("c:\\1.dat") ;
  File2_Stream->LoadFromFile("c:\\2.dat") ;
 
  if(File1_Stream->Size == File2_Stream->Size )
    {

        unsigned char *Buff1 = new unsigned char[File1_Stream->Size];
        unsigned char *Buff2 = new unsigned char[File2_Stream->Size];

        File1_Stream->Read(Buff1,  File1_Stream->Size);
        File2_Stream->Read(Buff2, File2_Stream->Size);
        if(memcmp(Buff1, Buff2, File2_Stream->Size)!=0)
          {
               ShowMessage("Содержимое файлов разное") ;  
          }

          for(int a=0; a<File1_Stream->Size;a++)
            {
                 if(Buff1[a]!=Buff2[a])  Memo1->Lines->Add("В позиции - "+IntToStr(a)+" есть отличия :" +IntToHex(Buff1[a],2)+"!="+ IntToHex(Buff2[a],2)) ;

            }


    } else ShowMessage("Размеры Файлов разные") ;  

 delete  File1_Stream;
 delete File2_Stream;
 delete Buff1; 
 delete Buff2;









Это сообщение отредактировал(а) sp75 - 22.5.2007, 08:50
PM MAIL   Вверх
Anikmar
Дата 22.5.2007, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



sp75, мне кажется на больших файлах будет жирновато каждый из них дважды держать в памяти - один раз в потоке, второй раз в буфере для сравнения. На небольших сойдет, конечно, но если файлы метров по 200...
PM MAIL ICQ   Вверх
sp75
Дата 22.5.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 17.5.2007

Репутация: 1
Всего: 1



Цитата(Anikmar @ 22.5.2007,  09:07)
sp75, мне кажется на больших файлах будет жирновато каждый из них дважды держать в памяти - один раз в потоке, второй раз в буфере для сравнения. На небольших сойдет, конечно, но если файлы метров по 200...

Сравнивать 200 метров я думаю не будут. 
Можно убить   delete  File1_Stream;  delete File2_Stream;  после загрузки в буфер перд тем сохранив в переменную int длину файлов.

Пускай читает по 1 байту с           

char buff_s[1];
int iFileHandle = FileOpen(OpenDialog1->FileName, fmOpenRead);
FileRead(iFileHandle, buff_s, 1);
..............

Будет медленее smile

Это сообщение отредактировал(а) sp75 - 22.5.2007, 09:29
PM MAIL   Вверх
RatHat
Дата 22.5.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: -1
Всего: 1



sp75, я же написал "например, типа String", а не "обязательно, типа String" smile
А вообще, строковый тип понимает все символы, если я правильно помню.

--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
Anikmar
Дата 22.5.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(RatHat @  22.5.2007,  10:17 Найти цитируемый пост)
А вообще, строковый тип понимает все символы, если я правильно помню.

С нулем проблемы будут
PM MAIL ICQ   Вверх
sp75
Дата 22.5.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 17.5.2007

Репутация: 1
Всего: 1



Цитата(RatHat @ 22.5.2007,  10:17)
sp75, я же написал "например, типа String", а не "обязательно, типа String" smile
А вообще, строковый тип понимает все символы, если я правильно помню.

Неа String, AnsiString - не все понимает токо текс который закончится \0 , плюс до того ловит форматирование текста табуляцию \t , след строку \n. Загрузив в тип String не текстовые данные (например екзешник захочется сравнить) он их исковеркает, и сказит информацию тоесть отформатирует
PM MAIL   Вверх
Anikmar
Дата 22.5.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(sp75 @  22.5.2007,  10:27 Найти цитируемый пост)
он их исковеркает, и сказит информацию тоесть отформатирует 

Ну уж конечно не все так плохо, сам он ничего не будет форматировать - это при выводе на экран бяки лезут. Но с нулем точно проблемы будут.

PM MAIL ICQ   Вверх
RatHat
Дата 22.5.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: -1
Всего: 1



Цитата

Но с нулем точно проблемы будут.

Anikmar, есть такое.
я для такого случая функцию писал.
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.