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

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

Войти
Регистрация
Восстановить пароль
 
Rized
1 / 1 / 0
Регистрация: 23.05.2014
Сообщений: 15
#1

Обработка повторений строк в текстовом файле - C++

05.06.2014, 22:59. Просмотров 177. Ответов 0
Метки нет (Все метки)

Добрый вечер! Нужно обработать большой текстовый файл (119Мб, ~6млн. строк), в котором заведомо есть повторения строк и переписать в другой файл, уже без дубликатов строк. Для тестирования создал временный файл с 5 строками и 1 повторением, но скрипт не работает должным образом. Года три уже не работал с С++, голова не варит после 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
32
33
34
35
36
37
38
39
40
41
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main(int argc, char *argv[])
{   
    ifstream F, NF; ofstream NFW; char str1[255], str2[255];; bool ne;//ne(notequal) использую для определения повтора
    F.open("new1.txt"); NFW.open("new_nd.txt", ios::app); // new1.txt - исходный файл, new_nd.txt - файл для записи
    F >> str1; NFW << str1 << "\n"; NFW.close(); //Костыль, чтобы внутренний цикл хотя бы начал выполняться
    while(!F.eof()){
    ne = true; //Условно считаем, что повтора нет
    F >> str1;
    cout<<"F "<<str1<<endl;//Для отслеживания хода выполнения цикла
    NF.open("new_nd.txt"); //Открыл для чтения "файл для записи". 
    while(!NF.eof()){//Смотрю не повторяет ли текущая строка из F существующие записи в новом файле(NF)
    NF >> str2;
    cout<<"NF "<<str2 << endl; //Ещё одна темная махинация для анализа выполнения скрипта
    if(strcmp(str1, str2) ==0){//Вот этот блок ни разу не срабатывает, хотя аналогичный ниже - вполне
    ne = false; 
    cout << "Res is equal in logical block"<<endl; 
    }
    }
    if(ne){//Не повтор? Предыдущий блок не работает, это условие теряет смысл
    NFW.open("new_nd.txt", ios::app);
    NFW << str1 << "\n";
    NFW.close();
    }
    NF >> str2;
    NF.close();
    if(strcmp(str1, str2) == 0)
    {
           cout << "Result is equal"<<endl;//Для теста. Этот кусок срабатывает,когда в обходе встречается повтор. Проверено   
    }
    }
    F.close();
    system("PAUSE");
    return EXIT_SUCCESS;
}
Добавлено через 12 минут
Пишу на этом: Dev-C++ 5.0 beta 9.2 (4.9.9.2) with Mingw/GCC 3.4.2

Добавлено через 8 минут
Пардон, ребят. Проблему решил быстрее, чем её заметили. Если кому нужно: соль была в открытии/закрытии файлов и 1 лишнем потоке считывания. С 21 по 24 строку включительно можно убрать, 26, 30 и 31 - тоже. 27-29 ставятся вместо 35й.

Добавлено через 1 минуту
Абсолютно все cout'ы поставлены для отладки, их тоже можно (и нужно) снести.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2014, 22:59     Обработка повторений строк в текстовом файле
Посмотрите здесь:

C++ Алгоритм поиска строк в текстовом файле
Описать функцию TextSize (Name) целого типа, возвращающую число строк в текстовом файле C++
C++ Центрирование строк в текстовом файле
C++ Подсчитать количество строк в текстовом файле
C++ Найти количество строк в текстовом файле
C++ Файл: В текстовом файле подсчитать количество непустых строк.
Подсчет строк в гигантском текстовом файле > 4 Гб C++
Обработка данных, хранящихся в текстовом файле C++
C++ Найти самое короткое слово в заданном текстовом файле и количество его повторений
Удалить в текстовом файле символ распределитель в конце строк C++
C++ Описать функцию, которая подсчитывает количество пустых строк в текстовом файле
Каков самый быстрый способ узнать количество строк в оргомном текстовом файле в Windows? C++

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

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

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