Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С++; работа с данными из файла

244
22 октября 2008 года
UAS
2.0K / / 19.07.2006
Задание:
Цитата:
Дан список вузов страны с разбивкой по профилям (файл люой структуры). Количества профилей и вузов каждого профиля задать самостоятельно. Составить модуль формирования нового списка вузов заданного профиля, являющихся университетами.


XML использовать нельзя, к сожалению(( Проблема в том, чтобы обработать данные, полученные из файла.

Допустим, из файла считывается некоторая информация, например такая:

Цитата:

Медецинский 1ОМГУ ПГУ ТОГиНУ 1МИРП МикРат ЭлТэ
Технический 1ТГУ 1ТУСУР 1ТГАСУ ТУГИСУ ОЦАЦУ 1ОМПУЦА
Правоведение 1АНАГИ 1ОМГ МАИ МИА ТГНУ ТюмГУ
Психологический МПСИ 1ПУ-4 ИАнЧ КИбОМ 1ЕГУ ЮМГУ


где первое слово - профиль, далее через пробел идут ВУЗы, если первый символ в имени - '1', значит это университет. Проблема стоит в обработке данных.

Создаю приложение в Borland C++ Builder. В нём имеем один ComboBox, в котором храним выбранные категории и ListBox, в который параметры заносятся при выборе очередного профиля из ComboBox. Т.е. вешаю событие OnChange в ComboBox функцию, которая выводит список вузов данного профиля. Написал следующий код, проблема при выводе данных в ComboBox, то виснет, то ещё че-то.

Код:
bool newLine = true; // перешли ли на новую строку при парсинге файла
char symbol; // считываемый символ из файла
char categories[10][200]; // категории
char titles[10][200]; // хранит список универов в категории
unsigned int countCategories = 0; // кол-во категорий

// При создании формы следющая функция:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    FILE * pFile;
    pFile = fopen ("universities.txt","r");
    if(pFile==NULL) {
        Application->MessageBoxA("Error opening file","0_0");
        return;
    }


    char string[256];

    unsigned char i = 0;
    while(!feof(pFile)) {
        symbol = fgetc(pFile);
        if( symbol == 0x0A ) {
            string = '\0';
            strcpy(titles[countCategories],string);
            newLine = true;
            i = 0;
            continue;
        }
        if( symbol == ' ' && newLine ) {
            string = '\0';
            strcpy(categories[countCategories],string);
            newLine = false;
            countCategories++;
            i = 0;
        } else {
            string = symbol;
            i++;
        }
    }

    for(i = 0; i < countCategories; i++) {
        Form1->category_select->Items->Add(categories);
    }

    fclose (pFile);
}

// Функция, которая выводит вузы, тут и ошибка
void __fastcall TForm1::category_selectChange(TObject *Sender)
{
    int cat = Form1->category_select->ItemIndex;
    char string[256];
    if( cat == -1 ) { Application->MessageBoxA("Выбери категорию, демон!!!","0_0"); return; }
    Form1->list_items->Items->Clear();
    int i = 0;
    while(true) {
        if( titles[cat] == ' ' ) {
            string = '\0';
            Form1->list_items->Items->Add(string);
            i = 0;
        } else {
            string = titles[cat];
            i++;
        }
        if( titles[cat] == '\0' || i == 20 ) break; // чую здесь проблема
    }
}


Если можно, то укажите где ошибка, ну и просто общие советы, как это дело лучше организовать (так как С++ знаю поверхностно, в общем)
1.9K
23 октября 2008 года
max_dark
256 / / 11.11.2005
Проблема в отсутствии разделения индексов для titles[cat] и string
Код:
void __fastcall TForm1::category_selectChange(TObject *Sender) {
    int cat = Form1->category_select->ItemIndex;
    char string[256];
    if ( cat == -1 ) { Application->MessageBoxA("Выбери категорию, демон!!!","0_0"); return; }
    Form1->list_items->Items->Clear();
    int i = 0;
    int j=0;
    while (true) {
        if ( titles[cat][j] == ' ' ) { // !!!
            string = '\0';
            Form1->list_items->Items->Add(string);
            i = 0;
        }
        else {
            string = titles[cat][j]; // !!!
            i++;
        }
        if ( titles[cat][j] == '\0' ) break; // !!!
        j++;
    }
}
Не проверял, но должно работать
244
23 октября 2008 года
UAS
2.0K / / 19.07.2006
Да) Спс)) На ночь глядя, уже засыпая, накодил, и думал что i и i в разных частях будет разная :D:D Короче, натупил..

Спс, тему можно закрыть
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог