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

Программа чтения HTML-доумента - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Kovy
 Аватар для Kovy
7 / 7 / 0
Регистрация: 29.04.2009
Сообщений: 412
22.06.2010, 14:37     Программа чтения HTML-доумента #1
Вот таким бло исходное задание:
Термином является слово, выделенное «жирным» шрифтом (тег <b></b>). Программа находит термины в группе html-файлов, находящихся в заданном каталоге, и составляет таблицу ссылок на них, либо на абзацы, в которых они находятся.

Прога вроде должна работать, но не работает( Если указываю путь с самого начала, где нет файла нужного расширения, то пишет, что файл не найден, а если указываю правильный путь, то прога сразу падает. Причем не выводит никаких ошибок, просто идет закрытие программы и предложение провести отладку. Из чего я сделал вывод, что прога падает либо при открытии файла, либо при его чтении... Подскажите пожалуйста, что не так и что исправить.. и огромная просьба объяснить доступно)
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
#include <stdafx.h>     //Подключение необходимых библиотек
#include <stdio.h>
#include <io.h>
#include <windows.h>  
#include <direct.h> 
#include <conio.h>
#include <malloc.h>
 
#define MASK "*.htm"    //Маска поиска файлов
#define ESC 27          //Код клавиши Esc для выхода из программы   
#define NOFFILES 10     //Количество добавляемых элементов в ДМУ списка файлов
 
 
struct term_struct{     //Структура терминов (<b></b>)
    char word[255];     //Термин
    char *file_name;    //Имя файла 
    int free;           //Идентификатор свободности элемента в структуре терминов
};
 
 
 
 
 
int time;               //Глобальная переменная для определения время выполнения обработки файлов
 
 
int term(term_struct T[], char *fname, char *in, int str_id){
                        //Функция определения терминов и их записи в структуру
    int i,j=0,k,n=-1;                   
    char out[255];
    for(n=-1;T[n+1].free==1;n++);
                        //Поиск свободного элемента структуры
    for(i=0; i<=strlen(in); i++){
                        //Просмотр входной строки
        if(!str_id){    //В предидущем вызове строка закончилась
            if(in[i]=='<'&& (in[i+1]=='b'||in[i+1]=='B')&&(in[i+2]==' '||in[i+2]=='>')){
                        //Если нашелся открывающий тег(и его открывающая скобка <)
                j=0;
                n++;    //Переход на свободный элемент структуры
                for(j=i;in[j]!='>';j++)if(j>=strlen(in)-1)break;
                        //Пропуск тега (для случая <b ...>)
                i=j+1;
                for(j=i,k=0;in[j]!='<'&&in[j+1]!='/'&&(in[j+1]!='b'||in[j+1]!='B');k++,j++){
                        //Пока не найден закрывающий тег
                    if(in[j]=='<'&&in[j+1]!='/'){
                        //Пропуск тегов внутри термина
                        while(j<=strlen(in)-1||in[j]!='>')j++;
                    }
                    if(j>=strlen(in)-1){
                        //Если конец строки: запомнить для следующего вызова
                        str_id=1; 
                        break;
                    }
                    out[k]=in[j];
                        //Переписывание в выходную строку
                }
                out[k]='\0';
                if(strlen(out)!=0){
                        //Если термин не пустое слово
                        strcpy(T[n].word,out);
                        //Запись в структуру
                        T[n].free=1;
                        //Изменение идентификатора заполненности элемента структуры
                        T[n].file_name=fname;
                        //Запись имени файла
                        i=j;
                }
            }
        }else{          //Если в предидущем вызове строка не закончилась
            str_id=0;   
            for(j=i,k=0;in[j]!='<';k++,j++){ 
                        //Ищем закрывающий тег
                    if(j>=strlen(in)){str_id=1; break;}
                        //Если строка закончилась, а тег не закрылся - запомнить
                    out[k]=in[j];
                        //Переписывание в выходную строку
                }
                out[k]='\0';
                strcat(T[n].word,out);
                        //Добавить к теущему термину продолжение
        }
            
    }
    return str_id;      
}
 
 
int read_file(term_struct T[],char *fname){
                        //Функция чтения файла      
    FILE *fd;
    char str[255];
    int i,body_id=0,str_id=0;   
                        //Идентификаторы: тега <body>, конца термина
    fd=fopen(fname,"r");//Открыть файл
    if(fd==NULL)return 0;
    while(fgets(str,255,fd)!=NULL){
                        //Построчное чтение
        if(str==NULL)return 0;
        if(body_id==0)
            for(i=0;i<strlen(str);i++)
                if(str[i]=='<'&&(str[i+1]=='b'||str[i+1]=='B')&&(str[i+2]=='o'||str[i+2]=='O')&&(str[i+3]=='d'||str[i+3]=='D')&&(str[i+4]=='y'||str[i+4]=='Y'))
                        //Пропускать строки, пока не встретится тег <body> - начало HTML документа
                body_id=1;
        if(body_id)str_id=term(T,fname,str,str_id);
    }                   //Вызвать функцию записи терминов в структуру
    fclose(fd);
    return 1;
}
 
void write_file(term_struct T[]){
                        //Запись терминов в выходной  файл
    FILE *fd;
    int i,j;
    fd=fopen("output.htm","w");
                        //Открыть файл
    fprintf(fd,"<html><head><title>Курсовая работа по информатике</title></b><BODY>\n");
    fprintf(fd,"<p><font face=\"Comic Sans MS Black\"><span style=\"font-size:18pt;\"><b>Термины</b></span></font></p>");
                        //Запись в файл 
    for(i=0;T[i].free==1;i++)
        fprintf(fd,"<p><b><A href=\"file://localhost/%s\">%d. %s</a><br>(%s)</b></p>\n", T[i].file_name, i+1, T[i].word, T[i].file_name);
                        //Запись терминов из структуры
    time=GetTickCount()-time;
    fprintf(fd,"Время выполнения: %d мс",time);
                        //Время выполнения
    fprintf(fd,"</BODY></html>");
    fprintf(fd,"\n");
    
    fprintf(fd,"\n");
    fclose(fd);
}
        
 
 
 
char **find_files(char dirname[]){
                        //Поиск файлов в заданном каталоге в ДМУ
    int i;
    char **pp=new char*[NOFFILES];
    char path[255];
    char tmp_path[255];
 
 
    strcpy(path,dirname);
    strcpy(tmp_path,dirname);
    strcat(path, MASK); //По заданной маске
 
 
 
    _finddata_t *fileinfo=new _finddata_t;
                        //Переменная для поиска типа _finddata_t
    long done = _findfirst(path,fileinfo);
    int MayWeWork = done;
 
 
    for (i=0;MayWeWork!=-1;i++){  
                        //Пока есть файлы, записать в ДМУ
        pp[i] = new char [strlen(fileinfo->name)+1];
        if (pp[i]==NULL) return NULL;
        
        strcat(tmp_path,fileinfo->name);
        strcpy(pp[i],tmp_path);
        strcpy(tmp_path,dirname);
 
        if ((i+1) % NOFFILES ==0) {
                        //Расширить при переполнении
            pp = (char**) realloc( (void*) pp,sizeof(char *) *(i+1+NOFFILES));
            if (pp ==NULL) return NULL;
        }
        
 
        MayWeWork = _findnext(done, fileinfo); 
        chdir(path);
    }
    _findclose(done);
    delete fileinfo;
    pp[i] = NULL;
    return pp;
}
 
 
 
void main(){
 
    int i;
    int n=0;
    term_struct *T=new term_struct[40000];
                        //Структура с терминами
    char **A=new char*[];
                        //ДМУ с именами найденых файлов
    char path[255];
    printf("Input a path to html files...\n");
    scanf("%s",&path);
                        //Ввести путь к HTML файлам
    time=GetTickCount();//Запуск таймера выполнения программы
    if(path[strlen(path)]!='\\')
                        //Если путь не содержит в конце "\", добавить
        strcat(path,"\\");
    A=find_files(path); //Найти файлы
    for(i=0;A[i]!=NULL;i++)n=read_file(T,A[i]);
                        //Прочитать файл и записать термины в структуру
    if(n){              //Если удалось, вывести результат
        write_file(T);  //Записать термины в выходной файл
        printf("\nComplite in %d ms.\nFiles: %d\n\nPress ESC for exit.",time,i);
    }else{              //Если нет, вывести сообщение
        printf("Error. Files not found.\nPress ESC for exit.");
    }
    while((getch())!=ESC);
                        //Ждать нажатия ESC
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
22.06.2010, 14:56     Программа чтения HTML-доумента #2
у меня всё работает, даже файл создает:
Термины
Время выполнения: 0 мс

Добавлено через 29 секунд
в качестве патча откуда читать html файлы я использовал с:\
Kovy
 Аватар для Kovy
7 / 7 / 0
Регистрация: 29.04.2009
Сообщений: 412
22.06.2010, 15:39  [ТС]     Программа чтения HTML-доумента #3
Спасибо большое... я так и подозревал, что это у меня проблемы. Скажите, это может быть связанно с этим Права доступа ??
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
22.06.2010, 16:11     Программа чтения HTML-доумента #4
Kovy, вот это точно не могу сказать, не в курсе
Kovy
 Аватар для Kovy
7 / 7 / 0
Регистрация: 29.04.2009
Сообщений: 412
22.06.2010, 17:11  [ТС]     Программа чтения HTML-доумента #5
А вы где проверяли? Если Visual Studio то какой версии?
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
22.06.2010, 21:51     Программа чтения HTML-доумента #6
Microsoft Visual Studio 2008
Kovy
 Аватар для Kovy
7 / 7 / 0
Регистрация: 29.04.2009
Сообщений: 412
23.06.2010, 18:47  [ТС]     Программа чтения HTML-доумента #7
Спасибо. Разобрался, вроде теперь работает.
Теперь другой вопрос))
Я хочу сделать что бы в выходном файле стояли ссылки не просто на исходную html-страницу, но и на сам термин.
C++
1
2
for(i=0;T[i].free==1;i++)
        fprintf(fd,"<p><b><A href=\"file://localhost/%s\">\%d. %s</a><br>(%s)</b></p>\n", T[i].file_name, i+1, T[i].word, T[i].file_name);
Вот в этом фрагменте я добавляю, что он дописывал ссылку внутри самого файла

C++
1
2
for(i=0;T[i].free==1;i++)
        fprintf(fd,"<p><b><A href=\"file://localhost/%s/#%i\">\%d. %s</a><br>(%s)</b></p>\n", T[i].file_name, i+1, T[i].word, T[i].file_name);
там, где печатается ссылка дописал: /#%i

Ссылка в итоге пишется ставится как надо. Однако вместо самого слова в выходном файле пишутся какие-то цифры и путь к исходному файлу. Например: 4325440. D:\\1.htm
И уже на этот бред если нажимаешь, то ссылаешь к нужному слову.
В чем причина? что исправить надо?

Добавлено через 5 часов 53 минуты
Извиняюсь, но снимаю предыдущий вопрос) Ночь промучался - получилось.

Теперь проблема в том, что собственно не могу пока эти внутренние ссылки прописать где надо в исходном файле. )

Добавлено через 13 часов 14 минут
Ну так что? подскажите как якоря оставить?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2011, 17:25     Программа чтения HTML-доумента
Еще ссылки по теме:

C++ Каким образом после чтения из файла, узнать позицию для чтения следующего куска байт
C++ Простая программа чтения и вывода
C++ Программа вылетает при попытке чтения из файла в переменную

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

Или воспользуйтесь поиском по форуму:
Bayirzhan
0 / 0 / 0
Регистрация: 16.11.2011
Сообщений: 10
01.12.2011, 17:25     Программа чтения HTML-доумента #8
а как можно переделать эту задачу на язык С
Yandex
Объявления
01.12.2011, 17:25     Программа чтения HTML-доумента
Ответ Создать тему
Опции темы

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