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

Программа, сравнивающая 2 текстовых файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
pwnzddwrt
 Аватар для pwnzddwrt
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
19.03.2013, 18:55     Программа, сравнивающая 2 текстовых файла #1
ребята, прошу помочь разобраться с программой на чистом СИ. В 1 файле текст, во 2 некоторые слова, встречающиеся в тексте из первого файла. Нужно сравнить эти файлы и удалить слова из 2-ого файла в первом. Одно замечание, на вход могут подаваться файлы абсолютно любого размера, т.е нужно выделять динамическую память, но выяснилось, что я не могу написать эту программку даже со статическими массивами. Дайте совет, что можно сделать. Вот кстати моя бредятина, ничего больше в голову не приходит:

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
#include<stdio.h>
#include<string.h>
int main()
{
    char first[]="file1.txt";
    char second[]="file2.txt";
    char str1[1000][20];
    char str2[1000][20];
    int i=0, j=0;
    int n=0;
    int m=0;
    FILE *f, *s;
    if ((f=fopen(first, "rt")) == NULL)
    {
        printf("error!");
        getchar();
        return;
    }
    while (!feof(f))
    {
        fscanf(f, "%s", &str1[i][0]);
        printf("%s ", str1[i]);
        i++;
        n++;
    }
    fclose(f);
    if ((s=fopen(second, "rt")) == NULL)
    {
        printf("\n\n\nError!");
        getchar();
        return;
    }
    while(!feof(s))
    {
        fscanf(s,"%s",&str2[i][0]);
        printf("\n\n%s", str2[i]);
        i++;
        m++;
    }
    fclose(s);
 
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            if(strcmp(str1[i],str2[j])==NULL)
            {
                strcpy(str1[i], " ");
            }
            getchar();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2013, 18:55     Программа, сравнивающая 2 текстовых файла
Посмотрите здесь:

Открываются 2 текстовых файла, сложить построчно числа из 1 и 2 файла, сумму вывести в третий файл построчно C++
C++ программа для шифрования и расшифровки текстовых файлов
C++ Не могу разобраться с чтением из файла и вводом текстовых данных в массив
C++ Сформировать два текстовых файла из целых чисел. Записать в третий файл минимальный элемент первого файла и максимальный элемент второго файла
Некорректность работы программы при считывании текстовых данных с файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pwnzddwrt
 Аватар для pwnzddwrt
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
21.03.2013, 22:50  [ТС]     Программа, сравнивающая 2 текстовых файла #2
Что, никто даже какого-нибудь совета не может дать?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.03.2013, 04:22     Программа, сравнивающая 2 текстовых файла #3
Со статическими:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include<stdio.h>
#include<string.h>
 
int main()
{
    char first[]="file1.txt";
    char second[]="file2.txt";
    char str1[1000][20];
    char str2[1000][20];
    int i = 0, j = 0;
    int n = 0;
    int m = 0;
    FILE *f, *s;
    
    if ((s = fopen(second, "rt")) == NULL)
    {
        printf("\n\n\nError!");
        getchar();
        return 1;
    }
    
    while(!feof(s))
    {
        fscanf(s,"%s", str2[i]);
        i++;
        m++;
    }
    fclose(s);
 
    for(i = 0; i < m; i++)
        printf("%s%c", str2[i], ' ');
    printf("\n");    
 
    if ((f = fopen(first, "rt")) == NULL)
    {
        printf("error!");
        getchar();
        return 1;
    }
    
    i = 0;
    while (!feof(f))
    {
        char temp[20];
        fscanf(f, "%s", temp);
        printf("%s ", temp);
        for(j = 0; j < m; j++)
            if(strcmp(temp, str2[j]) == NULL) break;
        
        if (j == m)
        {
            strcpy(str1[i], temp);
            n++;
            i++;
        }
     }
     fclose(f);
 
     printf("\n\n");
     
     for(i = 0; i < n; i++)
        printf("%s%c", str1[i], ' ');
 
     f = fopen(first, "w");
 
     for (i = 0; i < n; i++)
     {
        fprintf(f, "%s", str1[i]);
        if (i < (n - 1)) fprintf(f, "%c", ' ');
     }
 
    fclose(f);
      
    getchar();
    return 0;
}
pwnzddwrt
 Аватар для pwnzddwrt
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
22.03.2013, 10:54  [ТС]     Программа, сравнивающая 2 текстовых файла #4
Благодарю, выручили!
pwnzddwrt
 Аватар для pwnzddwrt
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
26.03.2013, 21:19  [ТС]     Программа, сравнивающая 2 текстовых файла #5
alsav22, не могли бы вы еще подсказать, как заменить функцию считывания fscanf в вашем коде, на fgets, для того чтобы на вход подавать файлы любого размера? 3-й день маюсь, не могу сообразить.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.03.2013, 21:44     Программа, сравнивающая 2 текстовых файла #6
Цитата Сообщение от pwnzddwrt Посмотреть сообщение
, как заменить функцию считывания fscanf в вашем коде, на fgets, для того чтобы на вход подавать файлы любого размера?
Как такая замена может помочь? Для файлов любого размера, нужно определять количество слов в файлах и создавать динамические массивы.
pwnzddwrt
 Аватар для pwnzddwrt
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
26.03.2013, 21:52  [ТС]     Программа, сравнивающая 2 текстовых файла #7
ок, понял, глупость сморозил, сейчас попробую динамическую память выделить.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.04.2013, 21:30     Программа, сравнивающая 2 текстовых файла #8
Результат работы:
Миниатюры
Программа, сравнивающая 2 текстовых файла  
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
07.04.2013, 21:35     Программа, сравнивающая 2 текстовых файла #9
pwnzddwrt, попробуйте мэпить файл. Так быстрее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2013, 00:31     Программа, сравнивающая 2 текстовых файла
Еще ссылки по теме:

C++ Имеются два текстовых файла с одинаковым числом строк. Выяснить совпадают ли их строки
C++ Программа, сравнивающая строчки массива
C++ Содержат ли два заданных текстовых файла одинаковые множества символов или нет?

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2013, 00:31     Программа, сравнивающая 2 текстовых файла #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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
// В 1 файле текст, во 2 некоторые слова, встречающиеся в тексте из первого файла.
// Нужно сравнить эти файлы и удалить слова из 2-ого файла в первом
// Предполагается, что в словах не более M - 1 символов.
// После последнего слова в файлах - конец файла.
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <ctype.h>
 
int main()
{
    setlocale(0, "");
    
    const int M = 50; // M - 1 - максимальное количество символов в словах
 
    char first [] = "file1.txt";
    char second[] = "file2.txt";
    
    FILE *f, *s;
    
    if ((s = fopen(second, "rt")) == NULL)
    {
        printf("\n\nError opening of the second file for reading!");
        getchar();
        return 1;
    }
    
    int count2 = 0; // количество слов во 2-ом файле
    char temp[M];
    while(!feof(s)) // подсчёт количества слов во 2-ом файле
    {
        fscanf(s,"%s", temp);
        ++count2;
    }
    rewind(s);
 
    char **str2 = (char**)malloc(count2 * sizeof(char*));  // массив под слова из 2-го файла
    if (!str2)
    {
        printf("\n\nOut of memory!");
        getchar();
        return 1;
    }
    for (int i = 0; i < count2; ++i)
    {
        str2[i] = (char*)malloc(M * sizeof(char));
        if (!str2[i])
        {
            printf("\n\nOut of memory!");
            getchar();
            return 1;
        }
    }
 
    for (int i = 0; i < count2; ++i) // чтение в массив и вывод слов из 2-го файла
    { 
        fscanf(s,"%s", str2[i]);
        printf("%s%c", str2[i], '\n');
    }
    printf("\n\n");
    
    fclose(s);   
    
    if ((f = fopen(first, "rb")) == NULL) // открываем 1-й файл для бинарного чтения
    {
        printf("\n\nError opening of the first file for reading!");
        getchar();
        return 1;
    }
   
    int size_file = 0; // количество символов (байт) в 1-ом файле
    fseek(f, 0, SEEK_END);
    size_file = ftell(f);
    fseek (f , 0, SEEK_SET);
    
    char *buffer = (char*)malloc(size_file);  // буфер под 1-ый файл
    if (!buffer)
    {
        printf("\n\nOut of memory!");
        getchar();
        return 1;
    }
    
    if(size_file != fread(buffer, 1, size_file, f )) // чтение 1-го файла в буфер
    {
        free(buffer);
        fclose(f);
        printf("\n\nRead data size is not equal to actual file size!");
        
        getchar();
        return 1;
    }
    
    fclose(s);
 
    if ((f = fopen("file1.txt", "wt")) == NULL)
    {
        printf("\n\nError opening of the first file for writing!");
        getchar();
        return 1;
    }
    
    int j = 0, n = 0, count1 = 0, count3 = 0; // count1 - количество слов в 1-м файле до обработки 
                                              // count3 - количество слов в первом файле после обработки
    while (n < size_file)
    {
        while (1) // запись пробельных символов до начала слова в файл
        {
            if (isspace((unsigned char)buffer[n]))
            {
                 putc(buffer[n], f);
                 ++n;
                 if (n >= size_file) break;
            }
            else break;
        }
        
        char temp[M];
        for (j = 0; (j < M) && (!isspace((unsigned char)buffer[n])) && (n < size_file); ++j, ++n) // чтение слова 
                temp[j] = buffer[n];
            
        temp[j] = '\0';
        ++count1;
        char *ind = NULL;
        char *end   = temp + strlen(temp) - 1; // указатель на последний символ слова 
        for(j = 0; j < count2; ++j) // сравнение слова из 1-го файла со словами из 2-го
        { 
            // если слово больше, чем один символ, и в коце слова стоит знак пунктуации
            if ((strlen(temp) > 1) && (ispunct((unsigned char)(*end))))
            {
                ind = end;
                while (ind > temp && ispunct((unsigned char)(*ind))) --ind; // пропускаем знаки пунктуации в конце слова
                
                int length = ind - temp + 1; // длина слова без знаков пунктуации
                ++ind; // начало знаков пунктуации
                
                if ((length == strlen(str2[j])) && (strncmp(temp, str2[j], length) == NULL)) break;  // сравниваем слово без знаков пунктуации
                
            }
            else if (strcmp(temp, str2[j]) == NULL) break;
        }
        
        if (j == count2) // если слово отсутсвует во втором файле
        { 
            fputs(temp, f); // запись слова в файл
            ++count3;
        }
        else if (ind != NULL)
                fputs(ind, f); // запись в файл знаков пунктуации без удалённого слова
        
    }
    
    fclose(f);
    
    for (int i = 0; i < count2; ++i) // освобождаем память под массивом со словами из 2-го файла
        free(str2[i]);
    free(str2);
 
    for (int i = 0; i < size_file; ++i) // вывод старого содержимого 1-го файла
        putc(buffer[i], stdout);
 
    free(buffer); // освобождаем память под буфером для 1-го файла
 
    if ((f = fopen("file1.txt", "rt")) == NULL)
    {
        printf("\n\nError opening of the first file for reading!");
        getchar();
        return 1;
    }
    
    printf("\n\n\n");
    
    char ch;
    while (1)  // вывод нового содержимого 1-го файла
    {   
        ch = fgetc(f);
        if (feof(f)) break;
        putc(ch, stdout);
    }
    fclose(f);
 
    printf("%s%d", "\n\n\nКоличество слов в 1-ом файле до обработки: ", count1);
    printf("%s%d", "\nКоличество слов в 1-ом файле после обработки: ", count3);
    printf("%s%d", "\nКоличество удалённых слов: ", (count1 - count3));
    
    
    getchar();
    return 0;
}
Yandex
Объявления
08.04.2013, 00:31     Программа, сравнивающая 2 текстовых файла
Ответ Создать тему
Опции темы

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