Показать полную графическую версию : *Решено* | Обработка массивов в С++
У меня возникла такая проблема, есть огромный массив символьного типа (считан из текстового файла, количество элементов может превышать 3млн). Массив представляет из себя вперемешку цифры и буквы (например: пр 126,45 24,5 в а), необходимо вычленнить из массива цифры и свормировать из них новый массив типа Float. Помогите плз, как сократить время на обработку, в идеале избегая рекурсий (очень долго получается), или может кто знает как считать из файла только цифры. Заранее благодарен.
Shad0VV
2 вопроса:
1) "пр 126,45 24,5" <- это разве char ? можно точно структуру исходного массива и при выполнении каких действий возникают тормоза
2) где тут можно рекурсии впихнуть ? вижу только 2 вложенных цикла...
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
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
Shad0VV
int i, n;
double r;
for(i = 0, r = 0, n=1; i < L; i++)
{
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])
n *=10;
else if(r)
{
cout << r << ' ';
n = 1;
r = 0;
}
}
if(r)
cout << r << ' ';
я бы по-другому сделал
// чтение файла
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"));
поправка: while(std::cin) заменить на for(;;)
Благодарю за помощь. Очень признателен.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.