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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сравнение строк txt файлов, выявление одинаковых строк 
:(
    Опции темы
disely
Дата 27.4.2008, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня есть 2-е кнопки. Под каждой из них я открываю файл txt. Использую VS 6, MFC. Нужно сравнить эти открытие файлы, а именно строчки. Если они одинаковы записать их в один файл, если строчки не повторялись, то записать их в др файл. 
Для создания объекта и открытия файла для чтения пишу
Код

........
CStdioFile File(DlgOpen.GetPathName(),CFile::modeRead|CFile::typeBinary);
.......

Подскажите плиз реализацию сравнения строк.
        
PM MAIL   Вверх
bronislav
Дата 27.4.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тебе на до найти строки из первого файла, которых нет во втором и строки, которые есть во втором?

Если так, то можно обойтись средствами STL

Код

strcmp(char*,char*);

Возвращает 0, если строки одинаковы

Это сообщение отредактировал(а) bronislav - 27.4.2008, 23:19


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
warmonger_
Дата 28.4.2008, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(bronislav @ 27.4.2008,  22:17)
Если так, то можно обойтись средствами STL

Код

strcmp(char*,char*);


эта функция не имеет отношения к STL
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
xvr
Дата 28.4.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(disely @ 27.4.2008,  22:54)
У меня есть 2-е кнопки. Под каждой из них я открываю файл txt. Использую VS 6, MFC. Нужно сравнить эти открытие файлы, а именно строчки. Если они одинаковы записать их в один файл, если строчки не повторялись, то записать их в др файл. 
Для создания объекта и открытия файла для чтения пишу
Код

........
CStdioFile File(DlgOpen.GetPathName(),CFile::modeRead|CFile::typeBinary);
.......

Подскажите плиз реализацию сравнения строк.

Используй stl. Читаешь строки из первого файла (все) в виде string и складывешь их в set. Потом читаешь строки из второго файла (по 1й штуке), проверяешь, есть ли она в set'е (set.count(str)!=0), в зависимости от результата, выводишь ее куда надо.

PM MAIL   Вверх
disely
Дата 28.4.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а что такое stl, объясните пожалуйста smile 
я вот не знаю как считать все строки если я не знаю заранее количество тих строк
про strcmp я понял
Код

if (strcmp(buf1, buf2) == 0)
    MessageBox("совпадает!");
 else......

"xvr" изменяюсь за свою тупость, с этого места можна поподробней:
Цитата

...и складывешь их в set....есть ли она в set'е (set.count(str)!=0), 
    


Это сообщение отредактировал(а) disely - 28.4.2008, 18:46
PM MAIL   Вверх
xvr
Дата 28.4.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(disely @ 28.4.2008,  11:45)
а что такое stl, объясните пожалуйста smile 

Библиотека такая, входит в стандарт языка С++ (в VS 6.0 имеется)
Цитата

я вот не знаю как считать все строки если я не знаю заранее количество тих строк
Читай подряд, пока файл не закончится

Цитата

"xvr" изменяюсь за свою тупость, с этого места можна поподробней:

Можно:
Код

set<CString> used_in_file_1;
CString str;

// Read whole file 1 (file1 is an CStdioFile)
while(file1.ReadString(str))
{
 used_in_file_1.insert(str);
}

// Read file 2 by line by line (file2 is CStdioFile)
while(file2.ReadString(str))
 if (used_in_file_1.count(str))
  {
    cout << "Duplicated string: " << (char*)str << endl;
  }
 else
  {
    cout << "Non duplicated string: " << (char*)str << endl;
  }

PM MAIL   Вверх
disely
Дата 29.4.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 хорошо попробую, если что напишу.
PM MAIL   Вверх
xvr
Дата 30.4.2008, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(disely @ 29.4.2008,  21:43)
 хорошо попробую, если что напишу.

Не забудь сделать в начале файла
Код

#include <set>
using namespace std;

PM MAIL   Вверх
Veniamin
Дата 29.11.2012, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть файл, он содержит строку. Нужно сравнить с ним две имеющиеся строки, которая совпадает, вывести ответ.
Код

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <dos.h>

void main ()
{
  int i;
  char a[8]="Moscow", b[8]="London", c[8];
  FILE *f1;
  clrscr();
  f1=fopen("d:\\args","r");
  i=strcmp(a, fgets(c,8,f1));
  printf ("i=%d",i);
  if (i==0)
     printf ("\n Совпадает 1я строка"); 
  else if (i<0 || i>0)
    { i=strcmp(b, fgets(c,8,f1)); printf ("i=%d",i); 
     if (i==0)
       printf ("\n Совпадает 2я строка"); 
       else if (i<0 || i>0)
        printf ("\n Ни одна строка не равна "); 
    }
   fclose(f1);
}

Подскажите пожалуйста,  почему когда во 2й раз использую переменную i для сравнения, результат не равен 0 (строка файла совпадает со 2й имеющейся строкой) ?
PM MAIL   Вверх
baldina
Дата 29.11.2012, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



потому что 2 раза fgets(c,8,f1);
второй раз считывается новая строка (а если в файле лишь одна строка, возвращается NULL)
Код

fgets(c,8,f1);
if (strcmp(a, c) == 0) {
 // совпадает 1я строка
} else if (strcmp(b, c) == 0) {
 // совпадает 2я строка
}


Это сообщение отредактировал(а) baldina - 29.11.2012, 18:31
PM MAIL   Вверх
xvr
Дата 30.11.2012, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Кроме того, fgets вернет строку с завершающим '\n'. У вас ни в одной строке, с которой вы сравниваетесь, этого '\n' нет, так что ни одна строка не совпадет
PM MAIL   Вверх
baldina
Дата 30.11.2012, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



если у него только одна строка, то совпадет
PM MAIL   Вверх
xvr
Дата 30.11.2012, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(baldina @  30.11.2012,  12:06 Найти цитируемый пост)
если у него только одна строка, то совпадет

Просто одной строки недостаточно, нужно еще что бы в конце ее не было перевода строки (некоторые редакторы могут этот самый перевод строки вообще сами влепить автоматически)

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


Эксперт
****


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

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



если есть перевод строки, это уже не одна строка))

Добавлено через 3 минуты и 45 секунд
ТС читает 8 символов (7 значащих), а сравнивает 6. 
поскольку число символов захардкодено, все наши измышления мимо))
PM MAIL   Вверх
Veniamin
Дата 30.11.2012, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



baldinaC вашим кодом получилось, благодарю.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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