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

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

Войти
Регистрация
Восстановить пароль
 
alex87
0 / 0 / 0
Регистрация: 03.08.2009
Сообщений: 12
03.08.2009, 12:30     Фильтрация текста в файле #1
Задача вот в чём: Имеется файл с тестовыми данными, некоторые данные повторяются в этом файле, необходимо написать программу, которая отфильтрует весь совпадающий текст и оставит только уникальный неповторяющийся текст, при этом перезаписав финальные результаты данных в изначальный текстовый файл
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
03.08.2009, 12:54     Фильтрация текста в файле #2
некоторые данные повторяются в этом файле
Что значит - повторяются ?
Строчки совпадают или что ?
И на каком языке - C или C++ ?
alex87
0 / 0 / 0
Регистрация: 03.08.2009
Сообщений: 12
03.08.2009, 13:01  [ТС]     Фильтрация текста в файле #3
язык С
да, прошу прощения, повторяются строчки
Alik-Soldier
9 / 9 / 0
Регистрация: 01.05.2009
Сообщений: 127
03.08.2009, 22:42     Фильтрация текста в файле #4
Можно например с помощью цикла считать посимвольно в двойной массив(например mas[i][j]) текст из файла,где i-строка в файле,j-элемент в строке. А далее сравнивать также посимвольно с помощью функции strcmp() и при совпадении строк одну пропускать.Ну а далее вы получите двойной массив,который просто нужно будет записать в файл
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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;
}
всё время хранишь указатель на хвост, чтобы каждый раз весь список не проходить

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

со списком будет выделяться ровно столько памяти, сколько будет нужно для строк, если там их две три или ноль, а с указателями всегда будет нужно выделить максимально большой массив, чтобы не случилось так, что строки в файле ещё есть, а массив до края заполнился и выводится (хотя остались ещё необработанные строки)
alex87
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;
}
Вот интересно может ли как-то таким идти решения и если да, то подскажите как закончить
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
04.08.2009, 20:57     Фильтрация текста в файле #7
if(str1==str2) bool=1;
Строки нужно сравнивать не так - ты сравниваешь адреса буферов.
Они кстати всегда будет различны.
А нужно сравнивать содержимое.
C++
1
if ( strcmp( str1, str2 ) == 0 ) ...
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.08.2009, 00:33     Фильтрация текста в файле #8
Цитата Сообщение от alex87 Посмотреть сообщение
язык С
да, прошу прощения, повторяются строчки
можно использовать stl? размер файла ограничен, или можен превышать размер доступной памяти?
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
05.08.2009, 00:37     Фильтрация текста в файле #9
можно использовать stl?
Ну какой STL, если сказано - на C
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2009, 06:07     Фильтрация текста в файле
Еще ссылки по теме:

Замена текста в файле C++
C++ Фильтрация текста
C++ Изменение строки текста в exe файле
C++ Поиск текста в файле
Как перезаписать участок текста в файле? C++

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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);
}
Yandex
Объявления
05.08.2009, 06:07     Фильтрация текста в файле
Ответ Создать тему
Опции темы

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