Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
1

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

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

Author24 — интернет-сервис помощи студентам
ребята, прошу помочь разобраться с программой на чистом СИ. В 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2013, 18:55
Ответы с готовыми решениями:

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

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

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

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

9
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
21.03.2013, 22:50  [ТС] 2
Что, никто даже какого-нибудь совета не может дать?
0
5498 / 4893 / 831
Регистрация: 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
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
22.03.2013, 10:54  [ТС] 4
Благодарю, выручили!
0
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
26.03.2013, 21:19  [ТС] 5
alsav22, не могли бы вы еще подсказать, как заменить функцию считывания fscanf в вашем коде, на fgets, для того чтобы на вход подавать файлы любого размера? 3-й день маюсь, не могу сообразить.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
26.03.2013, 21:44 6
Цитата Сообщение от pwnzddwrt Посмотреть сообщение
, как заменить функцию считывания fscanf в вашем коде, на fgets, для того чтобы на вход подавать файлы любого размера?
Как такая замена может помочь? Для файлов любого размера, нужно определять количество слов в файлах и создавать динамические массивы.
0
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 9
26.03.2013, 21:52  [ТС] 7
ок, понял, глупость сморозил, сейчас попробую динамическую память выделить.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.04.2013, 21:30 8
Результат работы:
Миниатюры
Программа, сравнивающая 2 текстовых файла  
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
07.04.2013, 21:35 9
pwnzddwrt, попробуйте мэпить файл. Так быстрее.
0
5498 / 4893 / 831
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2013, 00:31
Помогаю со студенческими работами здесь

Программа сравнивающая треугольники
Нужна программка, сравнивающая треугольники по 1, 2 и 3 признаку. Помогите плиз, оч нада.

Программа сравнивающая 2 массы
Рис расфасован в два пакета. Масса первого - m кг, второго – n кг. Составить программу,...

Программа, сравнивающая два числа: не могу найти ошибку
.model tiny .stack 100h .data word1 DW 53 word2 DW ? .code START: mov ax, word1 cmp ax,...

Существует ли программа сравнивающая данные двух таблиц excel или word?
Добрый день! Часто приходится сравнивать табличные данные из нескольких двух таблиц (excel, word)....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru