Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
OcbMuHor
Заблокирован
#1

С++ Удалить повторяющиеся строки - C++

07.06.2011, 21:07. Просмотров 3788. Ответов 11
Метки нет (Все метки)

Задача:
Задан файл с записями вида:
• фамилия;
• имя.
Создать файл с записями такого же вида, исключив из него повторяющиеся записи
Код:
C++
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
#include <fstream>
#include <string>
 
int main ()
{
    std::ifstream in;
    std::ofstream out;
    std::string str;
    in.open("F:\\txt.txt");
    out.open("F:\\txt1.txt");
    while (!in.eof())
        {
        std::getline(in, str);
        out << str << std::endl;
        }
    in.close();
    out.close();
    in.open("F:\\txt1.txt");
    do
    {
        std::getline(in, str);
        do
        {
                              // место для подсказки
        } while (in.eof());
    } while (in.eof());
return 0;
}
Алгоритм вижу так:
1. создать файл идентичный исходному
2. поиск и удаление строк дубликатов

Второй пункт алгоритма у меня не получается. Не вижу как можно сосчитать, пронумеровать и потом использовать количество строк. Надо ли это делать вообще?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2011, 21:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос С++ Удалить повторяющиеся строки (C++):

Удалить из строки всё повторяющиеся слова - C++
Нужно написать программу, чтобы найти все повторяющиеся слова в строке и удалить их, написал программу для определения слов вне зависимости...

Удалить из строки все повторяющиеся символы - C++
как удалить со строки все повторяющиеся символы???? заранее благодарен!

Удалить из строки все повторяющиеся слова (без учета регистра) - C++
Удалить из сообщения все повторяющиеся слова (без учета регистра). У меня строка вводится в Memo. Помогите пожалуйста. Добавлено...

Удалить из строки все повторяющиеся буквы, оставив только их первые вхождения - C++
2.Даны строки, содержащие латинские буквы. Удалить из строки все повторяю* щиеся буквы, оставив только их первые вхождения.

Обработка строки: удалить из числа все повторяющиеся цифры кроме первого вхождения - C++
С клавиатуры вводим произвольное число. От программы требуется удалить из этого числа все повторяющиеся цифры кроме первого вхождения. И...

Перевести из C++ в Си: удалить из исходной строки слова-палиндромы, повторяющиеся более двух раз - C++
Утро доброе. Нужна помощь. Перевести данный код в Си. Плюсы знаю хорошо, но проблема с реализацией его в Си, ибо не помню действий со...

11
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 17
07.06.2011, 21:12 #2
Открывать,проверять на повторения и записывать надо "одновременно".

Удалять не надо.Если есть нет повторения записываешь если есть пропускаешь.
0
OcbMuHor
Заблокирован
07.06.2011, 21:16  [ТС] #3
Цитата Сообщение от Avazart Посмотреть сообщение
Удалять не надо.
Открывать,проверять на повторения и записывать надо "одновременно".
Я тоже так изначально думал. Как бы так подсчитать количество строк в исходном файле, затем их проиндексировать, т.е. каждой строке присвоить свой идентификационный номер?
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 17
07.06.2011, 21:46 #4
Зачем? просто текущую строку заносиш в переменную буфер перемещаещся в начало файла и перебираеш строки сравнивая их с буфером в конце принимаешь решение о записи

Добавлено через 5 минут
Хотя в принципе да надо запоминать текущее положение в файле т.е строку

Добавлено через 11 минут
Вот пример удаление n-строки используя вспомогательный файл возможно пригодится.
C++
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
FILE *f;
char s[]="a.dat";
struct sr
  {
   int N,U;
   char  name[40],date[30];
  } b;
//-----  Удаление из  файла заданной строки
 
FILE *tmp;
int k;
 
if ((f=fopen(s,"rb"))==NULL)  { ShowMessage("Файла нет!");return;}
if ((tmp=fopen("b.dat","wb+"))==NULL)  { ShowMessage("Файла нет!");return;}
 
k=  ввод номера удаляемой строки
 
int kk;
while(fread(&b,sizeof(sr),1,f))   
 {
  kk = ftell(f)/sizeof(sr);
  if (k==kk) continue;
  fwrite(&b,sizeof(sr),1,tmp);  // запись во временный файл
 }
fclose(f);
fclose(tmp);
tmp=fopen("b.dat","rb");
f=fopen("a.dat","wb+");       // запись во основной файл
while( fread(&b,sizeof(sr),1,tmp) )  fwrite(&b,sizeof(sr),1,f);
fclose(tmp);
remove("b.dat");
Добавлено через 10 минут
То есть если вы использует структуру, то думаю стоит использовать бинарные файлы.
+ использовать ф-ции ftell, fseek
0
OcbMuHor
Заблокирован
07.06.2011, 22:08  [ТС] #5
где же Вы там у меня увидели структуру? Потом строка
C++
1
k=  ввод номера удаляемой строки
меня что-то не вставляет. Т.е. я заранее должен знать номер удаляемой строки? И как осуществить связку
C++
1
index.string
?
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 17
07.06.2011, 22:36 #6
Задан файл с записями вида:
• фамилия;
• имя.
Похоже на структуру с полями фамилия и имя.

Я привел только пример а не готовое решение.

Добавлено через 7 минут
Использовать vcl как я понимаю нельзя?
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
07.06.2011, 22:53 #7
Вот так ещё и по алфавиту отсортирует
C++
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
37
38
39
#include <iostream>
#include <fstream>
#include <string>
#include <set>
#include <cstdlib>
#include <iterator>
#include <algorithm>
 
int main(){
    const char * fileName = "file.txt";
    std::ifstream ifs(fileName);
    if ( ! ifs.is_open() ){
        std::cerr << "Can't open file " << fileName << " for input!" << std::endl;
        system("pause");
        return 1;
    }
    std::set<std::string> set;
    std::string str;
 
    while ( std::getline(ifs, str) )
        set.insert(str);
 
    ifs.close();
 
    std::ofstream ofs(fileName);
    if ( ! ofs.is_open() ){
        std::cerr << "Can't open file " << fileName << " for output!" << std::endl;
        system("pause");
        return 1;
    }
 
    std::copy(set.begin(), set.end(), std::ostream_iterator<std::string>(ofs, "\n"));
    ofs.close();
 
    std::cerr << "Done." << std::endl;
    system("pause");
 
    return 0;
}
0
OcbMuHor
Заблокирован
07.06.2011, 23:17  [ТС] #8
Жаль скомпилировать пока не могу. Ведь все элементы, помещенные в set сортируются автоматически по возрастанию))) Это конечно хорошо, инициатива и все такое, может есть путь как обойтись без set?
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
08.06.2011, 00:24 #9
Цитата Сообщение от OcbMuHor Посмотреть сообщение
может есть путь как обойтись без set?
ага
C++
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
37
38
39
40
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>
#include <iterator>
#include <algorithm>
 
int main(){
    const char * fileName = "file.txt";
    std::ifstream ifs(fileName);
    if ( ! ifs.is_open() ){
        std::cerr << "Can't open file " << fileName << " for input!" << std::endl;
        system("pause");
        return 1;
    }
    std::vector<std::string> vec;
    std::string str;
 
    while ( std::getline(ifs, str) )
        if ( std::find(vec.begin(), vec.end(), str) == vec.end() )
            vec.push_back(str);
 
    ifs.close();
 
    std::ofstream ofs(fileName);
    if ( ! ofs.is_open() ){
        std::cerr << "Can't open file " << fileName << " for output!" << std::endl;
        system("pause");
        return 1;
    }
 
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(ofs, "\n"));
    ofs.close();
 
    std::cerr << "Done." << std::endl;
    system("pause");
 
    return 0;
}
1
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 17
08.06.2011, 23:37 #10
Пробывал юзать seekg(0,ios::beg) для перемещение в начало файла, но почему то она не срабатывает после достижения конца файла.
0
OcbMuHor
Заблокирован
08.06.2011, 23:42  [ТС] #11
закомментировал. верно понял операторы?
C++
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
int main()
{
    const char * fileName1 = "F:\\txt.txt";       //инициализация исходного файла
    const char * fileName2 = "F:\\txt1.txt";     //инициализация выходного файла
    std::ifstream ifs(fileName1);             //инициализация входного потока из файла
    if ( ! ifs.is_open() )                    //проверка фатка открытия входного потока
    {
    std::cerr << "Can't open file " << fileName1 << " for input!" << std::endl;
        system("pause");
        return 1;
    }
    
    std::vector<std::string> vec;   //инициализация вектора для хранения строки
    std::string str;                //инициализация строки
    
    while ( std::getline(ifs, str) )   //запуск цикла считывания строки из входного потока
    if ( std::find(vec.begin(), vec.end(), str) == vec.end() )   //проверка вектора на наличие вновь помещенной строки
    vec.push_back(str);                           //и перемещение ее в конец в случае true
    
    ifs.close();                    //закрытие входного потока
    std::ofstream ofs(fileName2);       //инициализация выходного потока
    if ( ! ofs.is_open() )              //проверка фатка открытия выходного потока
    {
    std::cerr << "Can't open file " << fileName2 << " for output!" << std::endl;
    system("pause");
    return 1;
    }
    //копирование элементов вектора в файл
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(ofs, "\n"));
    ofs.close();
    
    std::cerr << "Done." << std::endl;  //Вывод сообщения об окончания программы
    system("pause");
    return 0;
}
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
09.06.2011, 09:46 #12
Цитата Сообщение от OcbMuHor Посмотреть сообщение
верно понял операторы?
ага
1
09.06.2011, 09:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2011, 09:46
Привет! Вот еще темы с ответами:

Обработка строки: удалить из числа все повторяющиеся цифры кроме первого вхождения - C++
С клавиатуры вводим произвольное число. От программы требуется удалить из этого числа все повторяющиеся цифры кроме первого вхождения. И...

Удалить повторяющиеся слова - C++
char mas; char let; cout &lt;&lt; &quot;Введите строку: &quot;; gets(mas); cout &lt;&lt; endl; cout &lt;&lt; &quot;Введите подстроку: &quot;;...

Удалить повторяющиеся слова - C++
ребятки помогите пожлста! не успела сделать вовремя (проболела после сессии долго). читать книжки пробовала, гуглила инет, но под мое...

удалить повторяющиеся фамилии - C++
Здравствуйте, многоуважаемые умы.. Передо мной стояла задача такая: &quot;Сведения о выдаче экземпляра журнала состоят из названия журнала,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru