Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/46: Рейтинг темы: голосов - 46, средняя оценка - 5.00
Заблокирован

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

07.06.2011, 21:07. Показов 9080. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.06.2011, 21:07
Ответы с готовыми решениями:

Удалить из строки повторяющиеся слова
Всем привет! Никак не могу разобраться с заданием из книги Бьерн Страуструпа: Задание: &quot;Читайте последовательность слов из...

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

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

11
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2011, 21:12
Открывать,проверять на повторения и записывать надо "одновременно".

Удалять не надо.Если есть нет повторения записываешь если есть пропускаешь.
0
Заблокирован
07.06.2011, 21:16  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Удалять не надо.
Открывать,проверять на повторения и записывать надо "одновременно".
Я тоже так изначально думал. Как бы так подсчитать количество строк в исходном файле, затем их проиндексировать, т.е. каждой строке присвоить свой идентификационный номер?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2011, 21:46
Зачем? просто текущую строку заносиш в переменную буфер перемещаещся в начало файла и перебираеш строки сравнивая их с буфером в конце принимаешь решение о записи

Добавлено через 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
Заблокирован
07.06.2011, 22:08  [ТС]
где же Вы там у меня увидели структуру? Потом строка
C++
1
k=  ввод номера удаляемой строки
меня что-то не вставляет. Т.е. я заранее должен знать номер удаляемой строки? И как осуществить связку
C++
1
index.string
?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2011, 22:36
Задан файл с записями вида:
• фамилия;
• имя.
Похоже на структуру с полями фамилия и имя.

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

Добавлено через 7 минут
Использовать vcl как я понимаю нельзя?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
07.06.2011, 22:53
Вот так ещё и по алфавиту отсортирует
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
Заблокирован
07.06.2011, 23:17  [ТС]
Жаль скомпилировать пока не могу. Ведь все элементы, помещенные в set сортируются автоматически по возрастанию))) Это конечно хорошо, инициатива и все такое, может есть путь как обойтись без set?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
08.06.2011, 00:24
Цитата Сообщение от 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
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.06.2011, 23:37
Пробывал юзать seekg(0,ios::beg) для перемещение в начало файла, но почему то она не срабатывает после достижения конца файла.
0
Заблокирован
08.06.2011, 23:42  [ТС]
закомментировал. верно понял операторы?
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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
09.06.2011, 09:46
Цитата Сообщение от OcbMuHor Посмотреть сообщение
верно понял операторы?
ага
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.06.2011, 09:46
Помогаю со студенческими работами здесь

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

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

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

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

Удалить повторяющиеся пробелы между отдельными словами строки (оставляя по одному пробелу)
Введите предложение, слова в котором разделены пробелами и в конце которого стоит точка. Удалите повторяющиеся пробелы между отдельными...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru