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

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

Войти
Регистрация
Восстановить пароль
 
KO42
5 / 5 / 0
Регистрация: 17.04.2011
Сообщений: 54
#1

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

19.02.2013, 22:26. Просмотров 965. Ответов 8
Метки нет (Все метки)

Доброго времени суток. Задача такая: есть текстовый файл 1.txt, в нём много строк которые могут повторятся. Нужно создать второй файл 2.txt, куда записать только те строки которые не повторяются.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4384 / 3227 / 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
1425 / 762 / 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трик
395 / 388 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
20.02.2013, 09:48     Убрать повторяющиеся строки из файла #7
Если порядок строк можно менять, почему не использовать std::set?
Tulosba
:)
Эксперт С++
4384 / 3227 / 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++ Как убрать с конца строки знак переноса, после считывания ее из файла?
Удалить из строки всё повторяющиеся слова C++
C++ Убрать лишние(повторяющиеся) пробелы, и записать в файл

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

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

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