Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 03.08.2009
Сообщений: 12
1

Фильтрация текста в файле

03.08.2009, 12:30. Просмотров 1419. Ответов 9
Метки нет (Все метки)

Задача вот в чём: Имеется файл с тестовыми данными, некоторые данные повторяются в этом файле, необходимо написать программу, которая отфильтрует весь совпадающий текст и оставит только уникальный неповторяющийся текст, при этом перезаписав финальные результаты данных в изначальный текстовый файл
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2009, 12:30
Ответы с готовыми решениями:

Фильтрация текста
Подскажите. Есть например массив str Нужно из этого массива отобрать строки которые начинаются на...

Фильтрация русского текста
есть задача. Создать программу, фильтрующую текст, введенный с клавиатуры. Задача программы...

Фильтрация введённого текста
Собственно задача: Создать программу, фильтрующую текст, введенный с клавиатуры. Задача программы...

Фильтрация выбросов в архивном файле
Программа осуществляет чтение трендов из архивного файла заданного формата и строит их на Chart.В...

9
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
03.08.2009, 12:54 2
некоторые данные повторяются в этом файле
Что значит - повторяются ?
Строчки совпадают или что ?
И на каком языке - C или C++ ?
0
0 / 0 / 0
Регистрация: 03.08.2009
Сообщений: 12
03.08.2009, 13:01  [ТС] 3
язык С
да, прошу прощения, повторяются строчки
0
9 / 9 / 2
Регистрация: 01.05.2009
Сообщений: 127
03.08.2009, 22:42 4
Можно например с помощью цикла считать посимвольно в двойной массив(например mas[i][j]) текст из файла,где i-строка в файле,j-элемент в строке. А далее сравнивать также посимвольно с помощью функции strcmp() и при совпадении строк одну пропускать.Ну а далее вы получите двойной массив,который просто нужно будет записать в файл
0
4845 / 3266 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
04.08.2009, 06:51 5
C
1
2
3
4
struct node {
    char *pString;
    struct node *pNext;
};
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdlib.h>
#include <string.h>
 
/* DuplicateLine:  создаёт копию строки l в памяти */
char *DuplicateLine(const char *l)
{
    char *p;
    
    if ((p = (char *) malloc(strlen(l)+1)) != NULL);
        strcpy(p, l);
    return p;
}
 
/* FreeLine:  высвобождает строку l из памяти */
void FreeLine(const char *l)
{
    free((void *) l);
}
C
1
2
3
4
    if (!SearchNodeList())
        AddNodeList();
    PrintList();
    DestroyList();
для каждой строки, которую прочитал из файла, проводишь поиск по списку (начинается всё с пустого списка) и, если её в списке нет, создаёшь для неё узел и добавляешь его в конец списка
когда файл прочитан, переоткрываешь его и записываешь список

создание узла, если его нет
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdlib.h>
 
void *CreateNode(const char *l)
{
    struct node *p;
 
    if ((p = malloc(sizeof(struct node))) == NULL)
        return NULL;
    p->pString = DuplicateLine(l);
    p->pNext = NULL;
    return (void *) p;
}
добавление узла в список (если его нет)
C
1
2
3
4
5
6
7
8
9
void AddNodeList(struct node **ppTail, const char *l)
{
    struct node *p;
 
    if ((p = CreateNode(l)) == NULL)
        return;
    (*ppTail)->next = p;
    *ppTail = p;
}
всё время хранишь указатель на хвост, чтобы каждый раз весь список не проходить

а попроще - массив указателей на строки, вместо узлов просто строки в массиве указателей
тоже поиск проводишь, если строки нет, добавляешь её, индекс строк переставляешь (который считает сколько строк в массиве записано) и дальше двигаешь - имеет ограничение, придётся определиться сколько всего строк в файле может быть

со списком будет выделяться ровно столько памяти, сколько будет нужно для строк, если там их две три или ноль, а с указателями всегда будет нужно выделить максимально большой массив, чтобы не случилось так, что строки в файле ещё есть, а массив до края заполнился и выводится (хотя остались ещё необработанные строки)
2
0 / 0 / 0
Регистрация: 03.08.2009
Сообщений: 12
04.08.2009, 12:12  [ТС] 6
да вот тут сам немного начал разбираться и вчера кое-что набросал, но застрял
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
#include<stdio.h>
#include<conio.h>
int main()
{
file *f1, *f2;
char str1[60], str2[60];
int i, pos, bool;
 
f1=fopen("адрес файла", "r");
f2=fopen("vremenno", "w");
pos=bool=0;
 
while(!feof(f1))
{
fgets(str1, f1);
pos++; //определяем кол-во строк
}
fseek(f1, 0, SEEK_SET);
 
while(!feof(f1))
{
fgets(str1, f1);
for(i=0,i<pos,i++)
{
fgets(str2, f1);
if(str1==str2) bool=1;
}
if(bool==1) bool=0;
if(bool!=1) fputs(str1, f2);
}
fclose(f1);
fclose(f2);
f1=fopen("адрес файла", "a");
f2=fopen("vremenno", "r ");
while(!feof(f2))
{
fgets(str1, f2);
fputs(str1, f1);
}
fclose(f1);
erase(f2); //тут далее не помню, и запутался
 
return 0;
}
Вот интересно может ли как-то таким идти решения и если да, то подскажите как закончить
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
04.08.2009, 20:57 7
if(str1==str2) bool=1;
Строки нужно сравнивать не так - ты сравниваешь адреса буферов.
Они кстати всегда будет различны.
А нужно сравнивать содержимое.
C++
1
if ( strcmp( str1, str2 ) == 0 ) ...
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.08.2009, 00:33 8
Цитата Сообщение от alex87 Посмотреть сообщение
язык С
да, прошу прощения, повторяются строчки
можно использовать stl? размер файла ограничен, или можен превышать размер доступной памяти?
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
05.08.2009, 00:37 9
можно использовать stl?
Ну какой STL, если сказано - на C
0
4845 / 3266 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
05.08.2009, 06:07 10
сначала прочитать файл, потом обработать, потом перезаписать
то есть не всё сразу

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char *DuplicateLine(const char *l);
void FreeLine(const char *l);
 
/* открывает файл, считывает строки в массив указателей,
   выводит его, освобождает память и закрывает файл */
main()
{
    FILE *ifp;
    char tmp[1000], *lines[300];
    unsigned n;
    int i;
    
    if ((ifp = fopen("file.txt", "r")) == NULL)
        return 1;
        
    n = 0;
    while (n < 300 && fgets(tmp, sizeof tmp, ifp)) {
        lines[n] = DuplicateLine(tmp);
        n++;
    }    
    
    for (i = 0; i < n; i++)
        printf("%s", lines[i]);
    
    for (i = 0; i < n; i++)
        FreeLine(lines[i]);
    
    fclose(ifp);    
    return 0;
}
 
/* DuplicateLine:  создаёт копию строки l в памяти */
char *DuplicateLine(const char *l)
{
    char *p;
    
    if ((p = (char *) malloc(strlen(l)+1)) != NULL);
        strcpy(p, l);
    return p;
}
 
/* FreeLine:  высвобождает строку l из памяти */
void FreeLine(const char *l)
{
    free((void *) l);
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2009, 06:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Фильтрация значений в Excel файле
Есть экселевский файл, в нем 10 листов, 1 лист = 1 день, в каждом листе по примерно 1000 значений,...

Фильтрация строк в csv файле
Прошу помощи в реализации нужно удалить строки из csv содержащие определенные слова пробовал при...

Выполнение условия в bat файле по наличию текста в определённом файле
Задача: найти опеределённую строчку текста в файле и если она совпадает с искомой, то выполнить...

Фильтрация текста
Добрый вечер, Столкнулся со следующей проблемой: Например, есть текст &gt;&gt;AvitzminoZ&lt;&lt;. Как из...


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

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

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