Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   *Решено* | Обработка массивов в С++ (http://forum.oszone.net/showthread.php?t=55028)

Shad0VV 11-10-2005 18:06 363392

*Решено* | Обработка массивов в С++
 
У меня возникла такая проблема, есть огромный массив символьного типа (считан из текстового файла, количество элементов может превышать 3млн). Массив представляет из себя вперемешку цифры и буквы (например: пр 126,45 24,5 в а), необходимо вычленнить из массива цифры и свормировать из них новый массив типа Float. Помогите плз, как сократить время на обработку, в идеале избегая рекурсий (очень долго получается), или может кто знает как считать из файла только цифры. Заранее благодарен.

Savant 11-10-2005 18:58 363403

Shad0VV
2 вопроса:
1) "пр 126,45 24,5" <- это разве char ? можно точно структуру исходного массива и при выполнении каких действий возникают тормоза
2) где тут можно рекурсии впихнуть ? вижу только 2 вложенных цикла...

Shad0VV 11-10-2005 20:14 363423


char *data;

OpenDialog1->Execute() ;
H=FileOpen(OpenDialog1->FileName, fmOpenRead);
L=FileSeek(H,0,2);
FileSeek(H,0,0);
data=new char[L+1];
memset(data,0,L+1);
FileRead(H,data,10);

Это фрагмент кода, считывание производится в массив типа char, а 2 вложенных цикла - для определения где цифра а где нет на 64битном атлоне 3000+ выполнялись 2 минуты, потом я вырубил. Я просто не знаю как иначе считать информацию из такого файла, только через *char

Shad0VV 11-10-2005 20:18 363426

double rez,p1,p2;
char *data;
int k,H,L,BR;

float a;
OpenDialog1->Execute() ;
H=FileOpen(OpenDialog1->FileName, fmOpenRead);
L=FileSeek(H,0,2);
FileSeek(H,0,0);
data=new char[L+1];
memset(data,0,L+1);


--- FileRead(H,data,L);

прошу прощения, 10ку ставил для проверки считывания сразу double

Vlad Drakula 11-10-2005 23:26 363470

Shad0VV

PHP код:

int in;
double r;

for(
00n=1Li++)
{
  if(
'0'<=data[i] && '9'>=data[i])
    
r=(n>1)?(r+((double)data[i]-'0')/n):(r*10+data[i]-'0');
  else if(
','==data[i])
    
*=10;
  else if(
r)
  {
    
cout << << ' ';
    
1;
    
0;
  }
}
if(
r)
  
cout << << ' '


pva 13-10-2005 11:04 363866

я бы по-другому сделал
Код:

// чтение файла
std::cin.exceptions(ios::badbit|ios::failbit);
std::vector<double> result;

try
{
    while(std::cin)
    {
        while(!std::isdigit(std::cin.rdbuf()->sgetc())) {}
        double tmp;
        std::cin >> tmp;
        result.push_back(tmp);
    }
}
catch(std::ios::failure&)
{
}

// вывод
std::copy(result.begin(), result.end(), std::ostream_iterator<double,char>("\n"));


pva 13-10-2005 11:06 363868

поправка: while(std::cin) заменить на for(;;)

Shad0VV 15-10-2005 19:59 364572

Благодарю за помощь. Очень признателен.


Время: 20:08.

Время: 20:08.
© OSzone.net 2001-