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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Нужно написать код для программы, которая выводит на экран звездочки ("*") в таком порядке: http://www.cyberforum.ru/cpp-beginners/thread812932.html
Нужна помощь в решении проблемы. Правда язык обучения у меня английский, поэтому некоторые задания на английском. Задание #3: Нужно написать код для программы, которая выводит на экран звездочки ("*") в таком порядке: 9 звездочек в первой строке, 8 звездочек во второй, 7 звездочек в третьей строчке, 6 звездочек в четвертой строчке и так до конца, то есть на 9 строчке одна звездочка. Помогите)
C++ Создать программу, которая позволяет вводить несколько (сколько угодно) платежных ведомостей (определенную сумму) на каждый из трех магазинов Нужна помощь в решении проблемы. Правда язык обучения у меня английский, поэтому некоторые задания на английском. Задание #2: Надо создать программу, которая позволяет вводить несколько (сколько угодно) платежных ведомостей (определенную сумму) на каждый из трех магазинов: Магазин 1, Магазин 2, Магазин 3. Например, для Магазина 1 требуется ввести 10 сумм, для Магазина 2 - 5 сумм, для... http://www.cyberforum.ru/cpp-beginners/thread812924.html
Определить количество слов, которые начинаются и заканчиваются одной той же буквой C++
Помогите пожалуйста решить задачи 3. Дана строка, состоящая из слов, разделенных пробелами(одним). Определить количество слов, которые начинаются и заканчиваются одной той же буквой.
Удвоить вхождение некоторой буквы в тексте. C++
Помогите пожалуйста решить задачи 2.Удвоить вхождение некоторой буквы в тексте. Например, текст "banana" должен иметь вид "baanaanaa".
C++ Часто ли вы пользуетесь wchar_t, wstring, wcout, wcin? Какие в них недостатки? http://www.cyberforum.ru/cpp-beginners/thread812908.html
Сейчас в учебных целях нужно было для linux написать одну программу, работающую с кириллицей. Т.к. в консоли используется UTF-8, очень неудобно было работать со char-строками(чего стоят только подсчет длины строки или изменение одного определенного символа). Вопрос: часто ли вы это используете широкими строками? И на какие подводные камни можно натолкнуться, используя их?
C++ не могу разобраться с Условием! Напишите программу принимающую на выходе символ оператора с двумя опредантами и выводящую на экран результат вычисления! пример (+ 100 3.14), ( * 4 5 ) Считайте символ операции в объект типа string с именем operation и используя инструкцию if выясните какую операцию хочет выполнить пользователь например if (operation == "+") Считайте операнды в перенные типа double. Выполните операции с + - /... подробнее

Показать сообщение отдельно
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2013, 00:31
Кликните здесь для просмотра всего текста
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;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru