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

С++ под Linux

Войти
Регистрация
Восстановить пароль
 
Negoist
0 / 0 / 0
Регистрация: 09.04.2015
Сообщений: 7
#1

Подсчет одинаковых строк в обычных файлах - C++ Linux

01.02.2017, 13:32. Просмотров 113. Ответов 1

Доброго времени суток народ. Писал-калякал программку, указатели лепил. Но вот незадача - при компиляции выводит ошибку:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
||=== Build: Release in lab1 (compiler: GNU GCC Compiler) ===|
/home/mark/lab1/lab1/main.cpp||In function ‘int main(int, char**):|
/home/mark/lab1/lab1/main.cpp|165|warning: deprecated conversion from string constant to ‘char*[-Wwrite-strings]|
/home/mark/lab1/lab1/main.cpp|195|error: cannot convert ‘char* (*)[10]’ to ‘char*for argument ‘2’ to ‘void str_accs(stat*, char*)|
/home/mark/lab1/lab1/main.cpp|196|warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘char**[-Wformat=]|
||=== Build failed: 1 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|


Мозг уже не варит почему эту ошибку выдает, перечитав кучу тем к решению так и не пришел.

Собственно сам код:
Кликните здесь для просмотра всего текста
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
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include <getopt.h>
#include <pwd.h>
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdbool.h>
#include </usr/include/linux/limits.h>
#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>  /* open() and O_XXX flags */
#include <sys/types.h>  /* mode_t */
 
// Массив для временного хранения
// содержимого файла
static char** file_buf;
 
// Создание строки с информацие про доступ
void str_accs(struct stat* st, char* buf){
 
    for(int i = 0; i < 10; i++){
        buf[i] = 0;
    }
    // Доступ для владельца
    if ((st->st_mode & S_IRUSR) == S_IRUSR)
        buf[0] = 'r';
    else
        buf[0] = '-';
 
    if ((st->st_mode & S_IWUSR) == S_IWUSR)
        buf[1] = 'w';
    else
        buf[1] = '-';
 
    if ((st->st_mode & S_ISUID) == S_ISUID){
        if ((st->st_mode & S_IXUSR) == S_IXUSR)
            buf[2] = 's';
        else
            buf[2] = 'S';
    }
    else {
        if ((st->st_mode & S_IXUSR) == S_IXUSR)
            buf[2] = 'w';
        else
            buf[2] = '-';
    }
    // Доступ для группы
    if ((st->st_mode & S_IRGRP) == S_IRGRP)
        buf[3] = 'r';
    else
        buf[3] = '-';
 
    if ((st->st_mode & S_IWGRP) == S_IWGRP)
        buf[4] = 'w';
    else
        buf[4] = '-';
 
    if ((st->st_mode & S_ISGID) == S_ISGID){
        if ((st->st_mode & S_IXGRP) == S_IXGRP)
            buf[5] = 's';
        else
            buf[5] = 'S';
    }
    else {
        if ((st->st_mode & S_IXGRP) == S_IXGRP)
            buf[5] = 'w';
        else
            buf[5] = '-';
    }
    // Доступ для остальных
    if ((st->st_mode & S_IROTH) == S_IROTH)
        buf[6] = 'r';
    else
        buf[6] = '-';
 
    if ((st->st_mode & S_IWOTH) == S_IWOTH)
        buf[7] = 'w';
    else
        buf[7] = '-';
 
    if ((st->st_mode & S_IXOTH) == S_IXOTH)
        buf[8] = 'w';
    else
        buf[8] = '-';
}
 
// Подсчет строк в файле
int file_str_num(int f){
    int n = 0;
    char buf[1];
    int i = read(f,&buf,1);
    while (i != 0){
        if(buf[0] == '\n')
            n++;
        i = read(f,&buf,1);
    }
    return n;
}
 
// Чтение файла в массив
void read_file(int f, int col){
    char buf[1];
    char* buf_str = (char*)malloc(255);
    int j, len;
    int k = read(f,&buf,1);
    for(int i = 0; i < col; i++){
        j = 0;
        len = 1;
        while((buf[0] != '\n') && (k != 0)){
            buf_str[j] = buf[0];
            k = read(f,&buf,1);
            j++;
            len++;
        }
        buf_str[j] = '\0';
        file_buf[i] = (char *)malloc(len+1);
        strcpy(file_buf[i], buf_str);
        if(k != 0)
            k = read(f,&buf,1);
    }
}
 
 
// Сортировка строк в массиве (quick sort)
void sort_str (int first, int last){
    int i = first, j = last;
    char* x = file_buf[(first + last) / 2];
    char* a;
 
    do {
        while ((strcmp(file_buf[i], x)) < 0) i++;
        while ((strcmp(file_buf[j], x)) > 0) j--;
 
        if(i <= j) {
            if ((strcmp(file_buf[i], file_buf[j])) > 0){
                a = file_buf[i];
                file_buf[i] = file_buf[j];
                file_buf[j] = a;
            }
            i++;
            j--;
        }
    } while (i <= j);
 
    if (i < last)
        sort_str(i, last);
    if (first < j)
        sort_str(first, j);
}
 
//--------------------MAIN-----------------------
 
int main(int argc, char * argv [])
{
    char* InputPath = (char*)malloc(255);
    char* InFile = (char*)malloc(255);
    struct dirent* input_dir;
    struct stat* FileStatus;
    int d_file_In, col_str, j = 0;
    char* str1[10];
 
 
    if (argc==0){
        InputPath="./";
    }
    else{
        InputPath = argv[1];
    }
    printf("Анализ файлов в директории: %s\n", InputPath);
 
    DIR* InputDir = opendir(InputPath);
    if(InputDir==NULL){
        printf("\nЗаданный путь не является директорией или не существует!\n");
        return EXIT_FAILURE;
    }
 
    while ( (input_dir = readdir(InputDir)) != NULL) {
        // Получение полного имени файла
        InFile=strcpy(InFile,InputPath);
        if(InFile[strlen(InFile)-1] != '/')
            InFile=strcat(InFile,"/");
        InFile=strcat(InFile,input_dir->d_name);
        if(InFile[strlen(InFile)-1] == '~')
            continue;
        // Получение информации о файле
        int k1 = stat(InFile, FileStatus);
        if(k1 == -1){
            printf("Ошибка в функции stat \n");
            return EXIT_FAILURE;
        }
        // Если это обычный файл - анализируем его
        if((FileStatus->st_mode & S_IFMT) == S_IFREG){
            printf("\nФайл: %s", InFile);
            str_accs(FileStatus, &str1);
            printf("\nПрава доступа: %s\n", str1);
            d_file_In=open(InFile, O_RDONLY);
            // Подсчет количества строк в файле
            col_str = file_str_num(d_file_In);
            // Если в файле больше 1 строки,
            // то надо искать повторяющиеся
            if(col_str > 1){
                // Виделение памяти и чтение файла
                file_buf = (char **)malloc(col_str * sizeof(char *));
                lseek(d_file_In,0,SEEK_SET);
                read_file(d_file_In, col_str);
                // Сортировка строк
                sort_str(0, col_str-1);
                // Если есть повторяющиеся строки,
                // то выводим их
                j = 0;
                for(int i = 0; i < col_str-1; i++){
                    if(strcmp(file_buf[i], file_buf[i+1]) == 0){
                        j++;
                        if(i == col_str-2)
                            printf("%d повторения: %s\n", j+1, file_buf[i]);
                    }
                    else{
                        if(j > 0){
                            printf("%d повторения: %s\n", j+1, file_buf[i]);
                            j = 0;
                        }
                    }
                }
                for(int i = 0; i < col_str; i++){
                    free(file_buf[i]);
                }
                free(file_buf);
            }
            close(d_file_In);
        }
    }
    return 0;
 
    //--------------------END-MAIN-----------------------
}


Собственно какие могут быть идеи?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2017, 13:32     Подсчет одинаковых строк в обычных файлах
Посмотрите здесь:

Подсчёт количества одинаковых строк в файлах папки
C++ Builder Поиск одинаковых строк в файлах
UnixPosix, не ври мне! (неправильный подсчет времени вручную) C++ Linux
C++ Linux Как откомпилировать кода на C++ в ubuntu если он набран в текстовых файлах?
Вывод информации о пользователях и файлах C++ Linux
Проверка наличия одинаковых строк в двух файлах BAT
Нахождение одинаковых строк в двух файлах и вывод результата в третий файл Turbo Pascal

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nimazzzy
 Аватар для nimazzzy
494 / 450 / 118
Регистрация: 29.03.2016
Сообщений: 1,433
Завершенные тесты: 1
01.02.2017, 13:45     Подсчет одинаковых строк в обычных файлах #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Negoist Посмотреть сообщение
char* InputPath = (char*)malloc(255);
а потом
Цитата Сообщение от Negoist Посмотреть сообщение
InputPath="./";
Кто ж так строки присваивает? И память выделенную потерял. По рукам бить. InputPath это указатель, = для него это не изменение строки, а изменение адреса.
Цитата Сообщение от Negoist Посмотреть сообщение
str_accs(FileStatus, &str1);
str1 у тебя объявлен как массив указателей. А функция принимает указатель на char вторым параметром.
Со следующей строкой, в общем-то, то же самое. Ждет указатель на char, а ты массив из указателей на char отдаешь.
Yandex
Объявления
01.02.2017, 13:45     Подсчет одинаковых строк в обычных файлах
Ответ Создать тему
Опции темы

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