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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Kovy
7 / 7 / 0
Регистрация: 29.04.2009
Сообщений: 412
#1

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

22.06.2010, 14:37. Просмотров 1254. Ответов 7
Метки нет (Все метки)

Вот таким бло исходное задание:
Термином является слово, выделенное «жирным» шрифтом (тег <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
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2010, 14:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа чтения HTML-доумента (C++):

Программа чтения из файла - C++
Подскажите пожалуйста возможный алгоритм решения задачи: Таблица произвольной структуры в файле (база данных). Колонки таблицы...

Простая программа чтения и вывода - C++
#include &lt;stdio.h&gt; main(void) { int a,b,k; scanf (&quot;%d%d%d&quot;, &amp;a, &amp;b, &amp;k ); int i,q; for (i=1; i&lt;=k-1; i++) { if (k...

Программа вылетает при попытке чтения из файла в переменную - C++
Вот код #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; int main (void) ...

Не правильно работает программа посимвольного чтения из exe и записи в txt - C++
Вся суть программы заключается в посимвольном считывании кода из .exe файла, и запись в .txt файл в виде C++ кода который все эти символы...

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

Программа работает до определенного момента, потом вылетает, появляется ошибка чтения символов строки - C++
drug.h #pragma once #include &lt;iostream&gt; using namespace std; class drug { protected: string name; int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
22.06.2010, 14:56 #2
у меня всё работает, даже файл создает:
Термины
Время выполнения: 0 мс

Добавлено через 29 секунд
в качестве патча откуда читать html файлы я использовал с:\
1
Kovy
7 / 7 / 0
Регистрация: 29.04.2009
Сообщений: 412
22.06.2010, 15:39  [ТС] #3
Спасибо большое... я так и подозревал, что это у меня проблемы. Скажите, это может быть связанно с этим Права доступа ??
1
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
22.06.2010, 16:11 #4
Kovy, вот это точно не могу сказать, не в курсе
1
Kovy
7 / 7 / 0
Регистрация: 29.04.2009
Сообщений: 412
22.06.2010, 17:11  [ТС] #5
А вы где проверяли? Если Visual Studio то какой версии?
0
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
22.06.2010, 21:51 #6
Microsoft Visual Studio 2008
1
Kovy
7 / 7 / 0
Регистрация: 29.04.2009
Сообщений: 412
23.06.2010, 18:47  [ТС] #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 минут
Ну так что? подскажите как якоря оставить?)
0
Bayirzhan
0 / 0 / 0
Регистрация: 16.11.2011
Сообщений: 10
01.12.2011, 17:25 #8
а как можно переделать эту задачу на язык С
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2011, 17:25
Привет! Вот еще темы с ответами:

Оболочка для чтения html - Delphi
Здравствуйте! У кого нибудь есть готовая программа или исходник оболочки Delphi, для чтения HTML книг (можно и не Делфи, а другой язык)....

Запись и чтения в фаил из HTML страници - JavaScript
Возмижно ли на локальном компьюторе чтения и запись в фаил из страници HTML. Создал програмку из HTML себе и вот и возник вопрос.

Какая процедура для чтения html с диска webbrowser? - Delphi
Вот пример webbrowser в строке if Key = VK_RETURN then EmbeddedWB1.Navigate(IEAddress1.Text); для диалога соответственно

Заморочка с кодировкой после чтения скриптом файла и генерации HTML - PHP
Читаю скриптом имеющийся HTML файл и один в один его генерю. Но возникает заморочка с кодировкой. Если загрузить...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.12.2011, 17:25
Ответ Создать тему
Опции темы

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