Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение текстовых файлов, сравнить содержимое 2 текстовых файлов 
V
    Опции темы
koyot
Дата 6.4.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите, пожалуйста с решением задачи:
Есть 2 текстовых файла. Нужно сравнить их содержание без учета лишних пробелов, непечатных символов и регистра букв. Результат – файлы равны или не равны.
Помогите с общим алгоритмом решения, если можно, также подскажите функции, осуществляющие сравнение.
PM MAIL   Вверх
archimed7592
Дата 6.4.2008, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(koyot @  6.4.2008,  19:27 Найти цитируемый пост)
Помогите с общим алгоритмом решения

1. Считываешь оба файла в отдельные буфера.
2. Фильтруешь буфера на предмет ненужных символов(которые не учитываются при сравнении).
3. В итоге у тебя осталось два буфера, которые нужно сравнить побайтово. strcmp тебе в помощь.

1 и 2 можно совместить, т.е. считывать посимвольно и сразу решать, добавлять в буфер символ или нет. Если использовать буфферизованный поток(stdin и ф-ция getc), то разницы в производительности не будет(может быть даже лучше будет).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
koyot
Дата 13.4.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

2. Фильтруешь буфера на предмет ненужных символов(которые не учитываются при сравнении).


т.е., если я правильно понял, нужно указать символы, которые при сравнении не нужно учитывать?
или наоборот - указать только те, которые нужно учитывать

Добавлено через 8 минут и 3 секунды
А можно ли только нужные символы 1 файла занести в 1 массив, символы другого файла - в др. массив, а затем сравнить массивы?
PM MAIL   Вверх
archimed7592
Дата 13.4.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(koyot @  13.4.2008,  15:25 Найти цитируемый пост)
т.е., если я правильно понял, нужно указать символы, которые при сравнении не нужно учитывать?
или наоборот - указать только те, которые нужно учитывать

Лучше сверять символ с набор не нужных т.к. их по идее многим меньше, чем нужных, т.е. более рационально.


Цитата(koyot @  13.4.2008,  15:25 Найти цитируемый пост)
А можно ли только нужные символы 1 файла занести в 1 массив, символы другого файла - в др. массив, а затем сравнить массивы? 

Да, об этом я и говорю:
Цитата(archimed7592 @  6.4.2008,  20:22 Найти цитируемый пост)
1 и 2 можно совместить, т.е. считывать посимвольно и сразу решать, добавлять в буфер символ или нет. Если использовать буфферизованный поток(stdin и ф-ция getc), то разницы в производительности не будет(может быть даже лучше будет). 




--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
jonie
Дата 14.4.2008, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



1: тупо читаешь посимвольно с первого файла, пропуская ненужное. Нашли нужный символ.
начинаем читать также второй файл. Нашли символ2
если символ2!=символ1 тогда return false
если конец обоих файлов одновременно (в смысле значимых символов) return true;
если конец одного из файлов, но не конец второго (в смысле значимых символов) return false;
иначе goto1

если вернется true, то файлы одинаковые



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
koyot
Дата 20.4.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Благодарю за помощь
PM MAIL   Вверх
koyot
Дата 20.4.2008, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2jonie:
Цитата

тупо читаешь посимвольно с первого файла, пропуская ненужное.


Не подскажешь функцию, которая исключает те или иные символы либо разрешает осуществить поиск только указанных символов(диапозона символов)?

Это сообщение отредактировал(а) koyot - 20.4.2008, 21:29
PM MAIL   Вверх
jonie
Дата 21.4.2008, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



а ты if попробуй )


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
darkart
Дата 26.4.2008, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

без учета лишних пробелов

Считаю, что 1 пробел - норма. И лучше все-таки потестить.
Код

#include<stdio.h>
#include<ctype.h>

const unsigned short MAX_FILE_NAME_LENGTH=256;//максимальная длина имени файла

bool flcmp(const char* szFileNameFirst,const char* szFileNameSecond)
/*функция сравнения 2 файлов с именами szFileNameFirst и szFileNameSecond*/
{
  FILE* fFirst=fopen(szFileNameFirst,"r");//открытие первого файла для чтения
  if(!fFirst)//если открытие завершилось неудачей считаем, что  не равны
    return false;
  FILE* fSecond=fopen(szFileNameSecond,"r");//открытие второго файла для чтения
  if(!fSecond)//если открытие завершилось неудачей считаем, что  не равны
    return false;
  char cLastFirst,cFirst,cLastSecond,cSecond;//вспомогательные переменные
  cFirst=cSecond='\0';//инициализация переменных
  while(!feof(fFirst)&&!feof(fSecond))
  {
    if(!feof(fFirst))//если еще не конец файла
    {
      cLastFirst=cFirst;//запоминаем предыдущий "правильный символ"
      cFirst=fgetc(fFirst);//читаем текущий символ
      while(!feof(fFirst)&&((cFirst==' '&&cLastFirst==' ')||(cFirst<32)))//пока не конец файла пробрасываем пробелы>1 и символы до 32
        cFirst=fgetc(fFirst);//читаем очередной символ
    }
    if(!feof(fSecond))//если еще не конец файла
    {
      cLastSecond=cSecond;//запоминаем предыдущий "правильный символ"
      cSecond=fgetc(fSecond);//читаем текущий символ
      while(!feof(fSecond)&&((cSecond==' '&&cLastSecond==' ')||(cSecond<32)))//пока не конец файла пробрасываем пробелы>1 и символы до 32
        cSecond=fgetc(fSecond);
    }
    if(tolower(cFirst)-tolower(cSecond)||((feof(fFirst)||feof(fSecond))&&(!(feof(fFirst)&&feof(fSecond)))))//если переведенные в нижний регистр  символы не совпадают или не было изменений в каком-то из файлов
    {
      fclose(fFirst);//закрываем за собой файл
      fclose(fSecond);//закрываем за собой файл
      return false;//не сравнилось:)
    }
  }
  fclose(fFirst);//закрываем за собой файл
  fclose(fSecond);//закрываем за собой файл
  return true;
}

int main(int argc,char* argv[])
{
  char szFileNameFirst[MAX_FILE_NAME_LENGTH];//строка для хранения имени первого файла
  char szFileNameSecond[MAX_FILE_NAME_LENGTH];//строка для хранени имени второго файла
  printf("Please enter first file name:\n");
  gets(szFileNameFirst);//читаем имя первого файла
  printf("Please enter second file name:\n");
  gets(szFileNameSecond);//читаем имя второго файла
  /*печать результата*/
  printf("Result:\n");
  flcmp(szFileNameFirst,szFileNameSecond)?printf("YES\n"):printf("NO\n");
  return 0;
}


Это сообщение отредактировал(а) darkart - 26.4.2008, 01:11
PM MAIL WWW ICQ Skype GTalk   Вверх
koyot
Дата 8.5.2008, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



darkart, спасибо огромное! Я бы таким методом никогда не додумался бы написать программу. Обязательно протестирую и напишу о результатах
PM MAIL   Вверх
ASMatic
Дата 9.11.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



koyot

видимо код рабочий....иначе ты бы не забыл написать что он не работает smile 
PM MAIL   Вверх
koyot
Дата 11.11.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Тема закрыта, благодарю всех за помощь))
PM MAIL   Вверх
W4FhLF
Дата 11.11.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



А мы так переживали всё это время. Ну... хорошо то, что хорошо кончается, расходимся. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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