Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2011, 13:33   #1
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию Задача на анализ файла WSLOG.txt

Задача:
Необходимо проанализаровать и подсчитать запросы, а также вывести их в алфавитном порядке с подсчетом колическтва повторений.

Программа должна выдавать отчет о своей работе в виде:

Дата Запросы

25.04.2002 - 12
26.04.2002 - 10
27.04.2002 - 5

Всего было сделано (запросов) - 1679

Сортировка запросов:

Бухгалтерский учет - 25
Бухгалтерский журнал - 30

Сортировку запросов необходимо проводить по CGI-переменным

S21STR= S21ALL=

P.S.

wslog.txt я прикрепил к посту.

Я вот что написал:

Код:
#include <stdio.h>
#include <stdlib.h> 
#include <conio.h> 
#include <string.h> 
//-------------------Константы--------------------------------------------------------- 
#define STRING_SIZE 600
#define STRING_LENGTH 100 
typedef char string [STRING_SIZE]; 
int sort_function(const void *a, const void *b) 
{
   return( strcmp( (char*) a, (char*) b) ); 
} 

//-----------------------Начало--------------------------------------------------------- 
int main() 
{ 
   char mem[10]; 
   char S21ALL[8],S21STR[8]; //for remember CGI variables 
   string read, reqmas[STRING_LENGTH];  //array for requests from logtemp.txt 
   int count = 1, all_count = 1, i = 0,j = 0; //different counters 
   char *p_all, *p_str;  //pointers for strstr 
   char symbol; 
   FILE *f,*o,*lt; //input, output, and temp file. 
   f = fopen("wslog.txt","r"); //input file 
   o = fopen("logfinish.txt","w");      //output file 
   lt = fopen("logtemp.txt","w+");  //temp file 

//--------------------------Поиск и сортировка по датам----------------------------- 
   fgets(mem,11,f); 
   fgets(read,4000,f); 
   while(fgets(read,4000,f)) 
    { 
         if(!strncmp(mem,read,10)) 
              count += 1; 
         else 
         { 
           fprintf(o,"%s - %d\n",mem,count); 
           strncpy(mem,read,10); 
           count = 1; 
          } 
         all_count += 1; 
     } 
   fprintf(o,"%s - %d\n\nAll requests - %d\n\nRequests sorting:\n\n",mem,count,all_count); 
//-------------------------------Поиск запросов по CGI-------------------------------------------- 
   fseek(f,0,SEEK_SET) ; 
   strcpy(S21STR,"S21STR="); 
   strcpy(S21ALL,"S21ALL="); 
   while(fgets(read,4000,f)) 
   { 
       p_all = strstr(read,S21ALL);  //pointer to S21ALL Begin 
       p_str = strstr(read,S21STR);  //to S21STR begin 
       while((p_str < &read[strlen(read)])&&(p_str)) 
       { 
           p_str += 7*sizeof(char); 
           symbol = *p_str++; 
           while((symbol != '&') && (symbol != 10) && symbol) 
           { 
             fputc(symbol,lt); 
             symbol = *p_str++; 
           } 
       fputc('\n',lt); 
    p_str = strstr(p_str,S21STR); 
    } 
while((p_all < &read[strlen(read)])&&(p_all)) 
   { 
     p_all += 7*sizeof(char); 
     symbol = *p_all++; 
     while((symbol != '&') && (symbol != 10) && symbol) 
      { 
         fputc(symbol,lt); 
         symbol = *p_all++; 
      } 
      fputc('\n',lt); 
      p_all = strstr(p_all,S21ALL); 
   } 
} //-----------------Запись неповторяющихся запросов в массив---------------------------------- 
   fseek(lt,0,SEEK_SET); 
   count = 0; 
   strcpy(reqmas[i],fgets(read,100,lt)); 
   while(fgets(read,100,lt)) 
   { 
       if(strcmp(reqmas[i],read)) 
      { 
          for(j = 0; j < i+1; j++) 
          if(!strcmp(reqmas[j],read)) {count = 0; break;} 
             else 
          count = 1; 
       } 
       if(count) {strcpy(reqmas[++i],read); count = 0;} 
   }  
//-------------------------Сортировка массива с запросами---------------------------- 
   qsort((void*)reqmas,i,sizeof(reqmas[0]),sort_function); 
   count = 0; 
   fseek(lt,0,SEEK_SET);  
//-----------Подсчет повторяющихся запросов и вывод их в отчетный файл------ 
   for(j = 0;j<i;j++) 
    {  
      while(fgets(read,100,lt)) 
           if(!strcmp(reqmas[j],read)) count++; 
      for(int z = 0; z < strlen(reqmas[j]) - 1; z++) 
           fprintf(o,"%c",reqmas[j][z]); 
      fprintf(o," - %d\n",count); 
      count = 0; 
      fseek(lt,0,SEEK_SET); 
    }  
//--------Закрытие файлов и удаление дополнительного временного файла------- 
   fclose(lt); 
   fclose(f); 
   fclose(o); 
   remove("logtemp.txt"); 
   return 0; 
} 
//------------------------------------------КОНЕЦ--------------------------------------------------
Дык он сортирует не все запросы. Т.е. некоторые запросы не попадают в конечный отсортированный список. Подскажите как решить эту проблему?
Вложения
Тип файла: txt wslog.txt (408.2 Кб, 125 просмотров)
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 03.08.2011 в 13:36.
MooNDeaR вне форума Ответить с цитированием
Старый 03.08.2011, 13:48   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
wslog.txt я прикрепил к посту.
не-а... не прикрепили...


p.s. вот если бы Вам на Delphi надо было бы...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.08.2011, 14:19   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
не-а... не прикрепили...


p.s. вот если бы Вам на Delphi надо было бы...
Прикрепил

Delphi я еще не изучал. Но купил здоровенную книгу
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 03.08.2011, 14:28   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Delphi я еще не изучал. Но купил здоровенную книгу
ну, если надо решение на Delphi - обращайтесь... (если использовать стандартные коллекции, например, TStringList - думаю, что задача решается не очень сложно...)

а вообще, зачем Вам Delphi? уже пора C# изучать....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.08.2011, 18:10   #5
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

А на C++ что сложно что ли ?

Код:
#include <iostream>
#include <iterator>
#include <fstream>
#include <vector>
#include <string>
#include <map>

 void write_to_file ( const std::vector< std::string> &strlist, const std::string &request, const char *filename)
{
  std::map< std::string, size_t> map_req;
   for ( std::vector< std::string>::const_iterator it = strlist.begin(); it != strlist.end(); it++)
  {
	int index =0, length;
	 while ( ( index =it->find( request, index + 1)) != std::string::npos)
	{
	   if ( ( length =it->find( '&', index + request.length()) - index - request.length()) < 1) continue;
	   std::string s = it->substr ( index + request.length(), length);
	   if ( map_req.find( s) == map_req.end()) map_req[ s] = 1;
	   else map_req[ s]++;
	}
  }
  size_t sum =0;
   for ( std::map< std::string, size_t>::const_iterator it = map_req.begin(); it != map_req.end(); it++)
	sum += it->second;
  std::cout << request << " Requests: " << sum << std::endl;
  std::ofstream out_file( filename);
   if ( !out_file) return;
   for ( std::map< std::string, size_t>::const_iterator it = map_req.begin(); it != map_req.end(); it++)
	out_file << it->first << " : " << it->second << std::endl;
  out_file.close();
}
int main() {
  std::vector< std::string> strlist;
  std::ifstream file( "wslog.txt");
   if ( !file) return 0;
   while ( !file.eof())
  {
	std::string s;
	getline( file, s);
	strlist.push_back( s);
  }
  file.close();
  write_to_file ( strlist, "S21STR=", "S21STR.txt");
  write_to_file ( strlist, "S21ALL=", "S21ALL.txt");
  std::map< std::string, size_t> req_time;
   for ( std::vector< std::string>::const_iterator it = strlist.begin(); it != strlist.end(); it++)
  {
      int index;
       if ( ( index =it->find( '^')) == std::string::npos) continue;
      std::string s =it->substr( 0, index);
       if ( req_time.find( s) == req_time.end()) req_time[ s] = 1;
       else req_time[ s]++;
  }
   for ( std::map< std::string, size_t>::const_iterator it =req_time.begin(); it != req_time.end(); it++)
	std::cout << it->first << " : " << it->second << std::endl;
  std::cout << "Total : " << strlist.size() << std::endl;
  system("pause");
  return 0;
}
An1ka вне форума Ответить с цитированием
Старый 04.08.2011, 18:23   #6
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
А на C++ что сложно что ли ?
Да сложновато. "НиАсИлИл" пока я STL настолько хорошо

Единственный вопрос по программе (пока еще не копировал), почему не использовали using namespace std;

А то все эти std:: ну очень глаза решут. Ну или хотя бы просто using::cout
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 04.08.2011, 18:27   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Единственный вопрос по программе (пока еще не копировал), почему не использовали using namespace std;
когда в большом приложении возникнет проблема пересечения имен, сами отлично поймете, я лично обжигался уже, потому обычно тоже так делаю.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анализ Wav файла lacost Общие вопросы по Java, Java SE, Kotlin 4 17.12.2010 12:09
Как скопировать текст с файла 1.txt и записать в 2.txt Kasper1 Общие вопросы по Java, Java SE, Kotlin 1 14.12.2010 05:56
задача на двумерный массив. анализ столбцов nikita1 Помощь студентам 0 06.12.2010 20:01
Задача на анализ текстового файла Latedelivery Паскаль, Turbo Pascal, PascalABC.NET 4 31.10.2008 10:55
Задание на анализ и разбор xml файла JazonDinAlt Помощь студентам 3 04.05.2008 16:08