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

С++ под Linux

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

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

01.02.2017, 13:32. Просмотров 280. Ответов 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-----------------------
}


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

Поиск одинаковых строк в файлах - C++ Builder
Доброго дня.Подскажите как реализовать поиск дубликатов строк, в выбранных файлах. К примеру в Memo искомый текст и есть 10 txt...

Подсчёт количества одинаковых строк в файлах папки - Алгоритмы
Здравствуйте. Пытаюсь написать программу на C# со следующим алгоритмом: 1. В указанной папке, включая вложенные, найти все словари; ...

Проверка наличия одинаковых строк в двух файлах - CMD/BAT
Добрый день, помогите написать батник. Нужно следующее: 1. Есть .txt файл со следующим примерным содержимым: 123qwe 23afwae ...

Нахождение одинаковых строк в двух файлах и вывод результата в третий файл - Turbo Pascal
Помогите пожалуйста. Есть два тестовых файла, которые содержат строки (файлы большие, по 60k строк в каждом). Задача сравнить эти два...

Подсчет количества одинаковых строк - Free Pascal
Помогите пожалуйста,есть такая задача,например дана матрица: 1 2 3 4 5 5 4 3 2 1 1 3 4 8 9 1 2 3 4 5 6 5 4 8 7 надо найти...

Подсчет предложений во всех файлах - C++
Помогите доделать программу, задание: Напишите программу, которая открывает текстовый файл-список, содержащий имена файлов по одному на...

1
nimazzzy
Заблокирован
01.02.2017, 13:45 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Negoist Посмотреть сообщение
char* InputPath = (char*)malloc(255);
а потом
Цитата Сообщение от Negoist Посмотреть сообщение
InputPath="./";
Кто ж так строки присваивает? И память выделенную потерял. По рукам бить. InputPath это указатель, = для него это не изменение строки, а изменение адреса.
Цитата Сообщение от Negoist Посмотреть сообщение
str_accs(FileStatus, &str1);
str1 у тебя объявлен как массив указателей. А функция принимает указатель на char вторым параметром.
Со следующей строкой, в общем-то, то же самое. Ждет указатель на char, а ты массив из указателей на char отдаешь.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2017, 13:45
Привет! Вот еще темы с ответами:

Поиск одинаковых слов в текстовых файлах - C#
Есть 2 текстовых файла. Собственно нужно найти повторяющиеся слова. Как это можно сделать? Пытался так, но это совсем не то. ...

Поиск одинаковых слов в текстовых файлах - C++
помогите пожалуйста...C++ написать прогу которая 2 txt файла сравнивает на одинаковые слова и выводит их в qlistwidget или хотябы в 3...

Поиск в файлах строк по заданному слову и вывод найденных строк в текстовый файл - CMD/BAT
Прошу помощи, т.к. в командных файлах разбираюсь слабо. Имеется некое количество txt-файлов в подкаталогах (все именуются aircraft.cfg)....

Сравнение строк в нескольких файлах excel, копирование несовпадающих строк и их вывод в сводный файл - VBA
Добрый день, только только начал разбираться с VBA в excel, поэтому прошу помощи (схожие темы находил, но не смог преобразовать их...


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

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

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