Форум программистов, компьютерный форум CyberForum.ru

Убрать повторяющиеся строки из файла - C++

Восстановить пароль Регистрация
 
KO42
5 / 5 / 0
Регистрация: 17.04.2011
Сообщений: 54
19.02.2013, 22:26     Убрать повторяющиеся строки из файла #1
Доброго времени суток. Задача такая: есть текстовый файл 1.txt, в нём много строк которые могут повторятся. Нужно создать второй файл 2.txt, куда записать только те строки которые не повторяются.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2013, 22:26     Убрать повторяющиеся строки из файла
Посмотрите здесь:

C++ Строки. Повторяющиеся слова.
C++ удалить со строки все повторяющиеся символы
C++ С++ Удалить повторяющиеся строки
C++ Повторяющиеся строки матрицы.
строки с++. удалить повторяющиеся слова C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.02.2013, 22:59     Убрать повторяющиеся строки из файла #2
Можно использовать std::unique_copy например
Elovic
0 / 0 / 0
Регистрация: 14.12.2012
Сообщений: 14
19.02.2013, 23:16     Убрать повторяющиеся строки из файла #3
А можно поочередное сравнение строк и удаление повторяющихся))
Но тут люди посоветуют что то по лучше
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.02.2013, 23:38     Убрать повторяющиеся строки из файла #4
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
#include <iostream>
#include <string>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <vector>
 
int main(int argc, char** argv) {
    
    using std::string;
    
    std::ifstream inFile("D:/File.txt");
    if (inFile.is_open()) {
        string buffer;
        std::vector <string> vs;
        
        while (std::getline(inFile, buffer, '\n'))
            vs.push_back(buffer);
        //for (auto& x : vs) std::cout<<x<<"\n\n";
        
        inFile.close();
        
        std::ofstream outFile("D:/Results.txt");
        std::sort(vs.begin(), vs.end());
        std::unique_copy(vs.begin(), vs.end(), std::ostream_iterator<string> (outFile, "\n"));
        outFile.close();
    } else {
        std::cout << "Error opening file..." << std::endl;
    }
    
    return 0;
}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
20.02.2013, 00:14     Убрать повторяющиеся строки из файла #5
Вариант прогаммы, который оставляет только один экземпляр каждой строки (удаляет дубликаты):
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
41
42
43
44
45
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <iterator>
 
int main()
{
    std::string fileIn, fileOut;
 
    std::cout << "Input: ";
    std::cin >> fileIn;
    std::cout << "Output: ";
    std::cin >> fileOut;
 
    std::ifstream in(fileIn.c_str(), std::ios::in | std::ios::binary);
    std::ofstream out(fileOut.c_str(), std::ios::out | std::ios::binary);
 
    if (!in.good() || !out.good())
    {
        std::clog << "Couldn't open file(s).\n";
        exit(1);
    }
 
    std::string temp;
    std::vector<std::string> sent;
 
    std::getline(in, temp);
    while (!in.eof())
    {
        sent.push_back(temp);
        std::getline(in, temp);
    }
 
    std::ostream_iterator<std::string> oo(out, "\n");
    std::sort(sent.begin(), sent.end());
    std::unique_copy(sent.begin(), sent.end(), oo);
 
    in.close();
    out.close();
 
    return 0;
}
А вот ваш вариант:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <fstream>
#include <list>
#include <string>
#include <cstdlib>
 
int main()
{
    std::string fileIn, fileOut;
 
    std::cout << "Input: ";
    std::cin >> fileIn;
    std::cout << "Output: ";
    std::cin >> fileOut;
 
    std::ifstream in(fileIn.c_str(), std::ios::in | std::ios::binary);
    std::ofstream out(fileOut.c_str(), std::ios::out | std::ios::binary);
 
    if (!in.good() || !out.good())
    {
        std::clog << "Couldn't open file(s).\n";
        exit(1);
    }
 
    std::string temp;
    std::list<std::string> sent;
 
    std::getline(in, temp);
    while (!in.eof())
    {
        sent.push_back(temp);
        std::getline(in, temp);
    }
 
    sent.sort();
 
    for (std::list<std::string>::iterator iter1 = sent.begin(); iter1 != sent.end(); ++iter1)
    {
        std::list<std::string>::iterator iter2 = iter1;
        for ( ; iter2 != sent.end() && *iter2 == *iter1; ++iter2)
            ;
        --iter2;
        if (iter2 == iter1)
               out << *iter1 << '\n';
        else
            iter1 = iter2;
    }
 
    in.close();
    out.close();
 
    return 0;
}
Добавлено через 3 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
Можно использовать std::unique_copy например
В этом случаи один экземпляр повторяющейся строки останется.
anklbenz
7 / 7 / 1
Регистрация: 21.12.2012
Сообщений: 65
20.02.2013, 02:48     Убрать повторяющиеся строки из файла #6
вариант без векторов. В корне диска С: должен быть файл со строками 1.txt
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
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
bool FindRepeat(string _str)
{
       ifstream temp;
       string temp_str;
       temp.open("C:/2.txt"); //открываем файл куда будем сохранять строки
    while(!temp.eof())     // в этом цикле перебераем 
    {
      getline(temp, temp_str);   
      if(_str==temp_str) 
            return true;
     }
   temp.close();
   return false;
}
int main ()
{
   string str;
   ifstream input;
   input.open("C:/1.txt");
   ofstream output_file("C:/2.txt");
while(!input.eof())
  {
   getline(input, str);//получаем строку в исх файле
   if(!FindRepeat(str))
     output_file<<str<<endl;
   }
  return 0;}
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
20.02.2013, 09:48     Убрать повторяющиеся строки из файла #7
Если порядок строк можно менять, почему не использовать std::set?
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.02.2013, 11:25     Убрать повторяющиеся строки из файла #8
Цитата Сообщение от Пaтрик Посмотреть сообщение
Если порядок строк можно менять, почему не использовать std::set?
Пока автор не уточнит, какой вариант его точно устроит, можно строить только догадки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2013, 00:35     Убрать повторяющиеся строки из файла
Еще ссылки по теме:

C++ Исключить из матрицы повторяющиеся строки
C++ Напомните формулу (убрать или удалить , скрыть, повторяющиеся элементы)
C++ Убрать все повторяющиеся символы со строки

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

Или воспользуйтесь поиском по форуму:
KO42
5 / 5 / 0
Регистрация: 17.04.2011
Сообщений: 54
26.02.2013, 00:35  [ТС]     Убрать повторяющиеся строки из файла #9
Всем спасибо!!! Задачу решил.
Yandex
Объявления
26.02.2013, 00:35     Убрать повторяющиеся строки из файла
Ответ Создать тему
Опции темы

Текущее время: 12:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru