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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
pwnzddwrt
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
#1

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

19.03.2013, 18:55. Просмотров 1354. Ответов 9
Метки нет (Все метки)

ребята, прошу помочь разобраться с программой на чистом СИ. В 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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2013, 18:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа, сравнивающая 2 текстовых файла (C++):

Программа, сравнивающая строчки массива - C++
есть программа которая сравнивает элементы массива а нужно сравнивать группы элементов чтобы сравнить строки( 1 элемент 1 строки с 1...

Программа, сравнивающая стоимость двух товаров - C++
Известны данные о стоимости каждого из 6 наименований товаров. Составить программу, сравнивающую стоимость двух товаров (определяющую,...

Программа, сравнивающая два массива на равенство - C++
Здравствуйте! Не могли подсказать несколько примеров, как можно сравнивать два массива с целыми числами, один имеет размер 10, а другой 5. ...

Сформировать два текстовых файла из целых чисел. Записать в третий файл минимальный элемент первого файла и максимальный элемент второго файла - C++
Тема: работа с текстовыми файлами с использованием стандартных функций библиотеки stdio.h Нужно составить программу: Сформировать два...

Открываются 2 текстовых файла, сложить построчно числа из 1 и 2 файла, сумму вывести в третий файл построчно - C++
Товарищи, помогите с кодом пожалуйста.=( 1. Создать текстовый файл и сохранить в нём текст из 10..100 слов. Слова в тексте разделены...

программа для шифрования и расшифровки текстовых файлов - C++
программа для шифрования и расшифровки текстовых файлов.

9
pwnzddwrt
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
21.03.2013, 22:50  [ТС] #2
Что, никто даже какого-нибудь совета не может дать?
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.03.2013, 04:22 #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;
}
1
pwnzddwrt
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
22.03.2013, 10:54  [ТС] #4
Благодарю, выручили!
0
pwnzddwrt
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
26.03.2013, 21:19  [ТС] #5
alsav22, не могли бы вы еще подсказать, как заменить функцию считывания fscanf в вашем коде, на fgets, для того чтобы на вход подавать файлы любого размера? 3-й день маюсь, не могу сообразить.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.03.2013, 21:44 #6
Цитата Сообщение от pwnzddwrt Посмотреть сообщение
, как заменить функцию считывания fscanf в вашем коде, на fgets, для того чтобы на вход подавать файлы любого размера?
Как такая замена может помочь? Для файлов любого размера, нужно определять количество слов в файлах и создавать динамические массивы.
0
pwnzddwrt
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
26.03.2013, 21:52  [ТС] #7
ок, понял, глупость сморозил, сейчас попробую динамическую память выделить.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.04.2013, 21:30 #8
Результат работы:
0
Миниатюры
Программа, сравнивающая 2 текстовых файла  
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
07.04.2013, 21:35 #9
pwnzddwrt, попробуйте мэпить файл. Так быстрее.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2013, 00:31 #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;
}
1
08.04.2013, 00:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2013, 00:31
Привет! Вот еще темы с ответами:

Функция сравнивающая количество положительных и отрицательных элементов массива - C++
Разработайте программу , создав предварительно процедуру по условию задачи . Приведенные числа используйте для задания формата при...

Как сравнить два текстовых файла? - C++
Скажите пожалуйста как сравнить два тхт являются ли их содержания одинаковыми? И если нет то показать где именно ошибка на 3 м тхт файле. ...

Функция, сравнивающая две строки, игнорируя количество пробелов между словами - C++
Разработать функцию, которая сравнивает две строки, игнорируя количество пробелов между словами (использовать функции работы со строками). ...

Сравнить 2 текстовых файла и вывести количество правильных ответов - C++
В 1 файле имеется строка состоящая из цифр. Цифры- это номера ответов. Во 2 файле записана правильная последовательность ответов....


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

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

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