Войти

Показать полную графическую версию : *Решено* | Обработка массивов в С++


Shad0VV
11-10-2005, 18:06
У меня возникла такая проблема, есть огромный массив символьного типа (считан из текстового файла, количество элементов может превышать 3млн). Массив представляет из себя вперемешку цифры и буквы (например: пр 126,45 24,5 в а), необходимо вычленнить из массива цифры и свормировать из них новый массив типа Float. Помогите плз, как сократить время на обработку, в идеале избегая рекурсий (очень долго получается), или может кто знает как считать из файла только цифры. Заранее благодарен.

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

Shad0VV
11-10-2005, 20:14
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
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 << ' ';

pva
13-10-2005, 11:04
я бы по-другому сделал

// чтение файла
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
поправка: while(std::cin) заменить на for(;;)

Shad0VV
15-10-2005, 19:59
Благодарю за помощь. Очень признателен.




© OSzone.net 2001-2012