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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2013, 22:40   #1
Craz
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 21
По умолчанию функция strstr() в builder с++.

Доброго времени суток!)
У меня есть текстовый файл, в котором несколько раз повторяются нужные мне числа. Как можно организовать поиск этих чисел с последующей записью их в одномерный массив для обработки?
Я делал поиск через функцию strstr(), но она возвращает указатель только на ПЕРВЫЙ встретившийся искомый символ. Как сделать чтобы она искала и последующие искомые символы и забивать их в массив?
Я пока сделал только для первого встретившегося символа, помогите сделать для всех символов в файле. Заранее спасибо!)
Код:
int i=0, n=0, s=0;
    char *t;
    char *hour;

    TStrings * slist =new TStringList;
    if ( OpenDialog1->Execute())
    {
        HANDLE hFile = CreateFile(OpenDialog1->FileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if(hFile==0) return;
        unsigned long l;
        unsigned long size;
        size = GetFileSize(hFile, NULL);
        t = new char [size];
        ReadFile(hFile, t, size, &l, NULL);

        CloseHandle(hFile);
        //t[i][n]=LoadFromFile(OpenDialog1->FileName);
    }
    char temp[255];

    slist->LoadFromFile(OpenDialog1->FileName);
    s = slist->Count;
    hour = new char [s];
    Edit5->Text=s;

    for(int i; i < s; i++ )
    {
    ZeroMemory(&temp, 255);

    // Для часов
    char *sth = strstr(t, "***");
    char *del = strstr(sth, "\r\n");
    char *fh = del + 3;
    char *h = strstr(fh, ".");
    unsigned long lh = h - fh;
    temp[lh] = 0;
    strncpy(temp, fh, lh);

    hour[i]=StrToInt(temp);
    Edit6->Text=hour[i];

    StringGrid1->Cells[2][1] = StrToInt(temp);

    // Для минут
    char *fm = fh + 3;
    char *m = strstr(fm, " ");
    unsigned long lm = m - fm;
    temp[lm] = 0;
    strncpy(temp, fm, lm);
    StringGrid1->Cells[3][1] = StrToInt(temp);

    // Для года
    char *fy = fm + 3;
    char *y = strstr(fy, "-");
    unsigned long ly = y - fy;
    temp[ly] = 0;
    strncpy(temp, fy, ly);
    StringGrid1->Cells[6][1] = StrToInt(temp);

    // Для месяца
    char *fmnh = fy + 5;
    char *mnh = strstr(fmnh, "-");
    unsigned long lmnh = mnh - fmnh;
    temp[lmnh] = 0;
    strncpy(temp, fmnh, lmnh);
    StringGrid1->Cells[5][1] = StrToInt(temp);

     //Для дня
    char *fd = fmnh + 3;
    char *d = strstr(fd, " ");
    unsigned long ld = d - fd;
    temp[ld] = 0;
    strncpy(temp, fd, ld);
    StringGrid1->Cells[4][1] = StrToInt(temp);

    //Для смены
    char *fsm = fd + 5;
    char *sm = strstr(fsm, " ");
    unsigned long lsm = sm - fsm;
    temp[lsm] = 0;
    strncpy(temp, fsm, lsm);
    StringGrid1->Cells[7][1] = StrToInt(temp);

    //Для бригады
    char *fbr = fsm + 4;
    char *br = strstr(fbr, " ");
    unsigned long lbr = br - fbr;
    temp[lbr] = 0;
    strncpy(temp, fbr, lbr);
    StringGrid1->Cells[8][1] = StrToInt(temp);

    //Для плавки
    char *fpl = fbr + 5;
    char *pl = strstr(fpl, " ");
    unsigned long lpl = pl - fpl;
    temp[lpl] = 0;
    strncpy(temp, fpl, lpl);
    StringGrid1->Cells[1][1] = StrToInt(temp);

}
}
Craz вне форума Ответить с цитированием
Старый 15.07.2013, 07:11   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Сдвиньте полученный указатель дальше, на символ *за* первым результатом и повторите поиск, ну и по ходу дела забивайте все в массив.
waleri вне форума Ответить с цитированием
Старый 15.07.2013, 07:43   #3
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,609
По умолчанию

Конечными автоматами попробуйте.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 15.07.2013, 07:44   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от challengerr Посмотреть сообщение
Конечными автоматами попробуйте.
маразм, не нужно усложнять.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.07.2013, 07:56   #5
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,609
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
маразм, не нужно усложнять.
Полностью задача была поставлена автором в другой теме. Данная тема - последствие. Поставленная задача решается конечными автоматами.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 15.07.2013, 08:56   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

*Все* задачи решаются конечными автоматами.
waleri вне форума Ответить с цитированием
Старый 15.07.2013, 17:33   #7
Craz
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 21
По умолчанию

А можно пожалуйста это в коде написать, я не совсем понимаю как это "конечными автоматами"...
К примеру для вот этого кусочка:
Код:
// Для часов
    char *sth = strstr(t, "***");
    char *del = strstr(sth, "\r\n");
    char *fh = del + 3;
    char *h = strstr(fh, ".");
    unsigned long lh = h - fh;
    temp[lh] = 0;
    strncpy(temp, fh, lh);
А дальше, я сам продолжу...
Заранее спасибо!)
Craz вне форума Ответить с цитированием
Старый 18.07.2013, 04:41   #8
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Вот тебе просто все числа в массиве, а дальше сам шамань с массивов как-нибудь.
Код:
#include <vcl.h>
#include <vector>
#include <stdio.h>


bool FileScanNum(const TCHAR* fname, std::vector<int>* vns) {
        FILE* fp = _tfopen(fname, _T("r"));
        if(fp == NULL)
                return false;
        int num = 0;
        while(_ftscanf(fp, _T("%*[^0123456789]%d"), &num) == 1)
                vns->push_back(num);
        fclose(fp);
        return true;
}


int main(void) {
        std::vector<int> vs;
        FileScanNum(_T("number.txt"), &vs);

        for(size_t i = 0; i < vs.size(); i++)
                _tprintf(_T("%d\n"), vs[i]);

        getchar();
        return 0;
}
Nuklon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция strstr в си Катя Миронова Помощь студентам 6 27.05.2013 21:23
Функция C++ Builder Effractor C++ Builder 1 26.02.2012 18:56
Противоположная функция strstr() WebbMan Общие вопросы C/C++ 5 19.06.2011 15:14
C++ Builder функция возвращает ссылку на объект BleStaR Помощь студентам 12 25.06.2010 23:25
функция транспонирования матрицы,Builder C++ lamer74 Помощь студентам 2 05.12.2009 17:23