Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++]Работа с файлами и каталогами


Автор: HencHMaN 24.4.2009, 18:09
Собственно моё задание на С++:
Составить программу, которая анализирует заданный входной файл, содержащий текст программы на С++, и переписывает из него все идентификаторы в выходной файл. Повторения идентификаторов в выходном файле не допускаются.
Помогите пожалуйста в среду показать нужно.

Автор: Rififi 24.4.2009, 19:10
HencHMaN, 
Я вижу такой путь: у тебя есть 4 дня на то, чтобы изучить http://www.boost.org/doc/libs/1_38_0/libs/wave/index.html, и 1 день чтобы написать парсер

Автор: HencHMaN 25.4.2009, 19:19
Эм я только на 1м курсе универа мне не по силам то что ты сказал  smile 

Автор: Rififi 25.4.2009, 21:33
HencHMaN, 
А. Ну раз это очередная сферическая заглушка для препода, попробуй тупо на регэкспах сделать. Правда, думаю, что трудно будет избуежать ложных (не)срабатываний, поскольку задача в принципе не для регэкспов...

Автор: Dov 26.4.2009, 19:32
Могу предложить такой примитивный вариант. Он не обрабатывает комментарии, строковые константы, может ещё что-нибудь, особо не тестил. 
Код
bool isKeyword(char * word)
{
    // список зарезервированных слов, нужно его дополнить
    const char * keywords  = " return sizeof void false true int while const if bool for break continue ";
    
    return strstr(keywords, word) ? true : false;
}

bool isAlpha(char * word)
{
    return isalpha(word[1]) || word[1] == '_' ;
}

int main()
{
    char   idArray[4096] = "";
    char   buf[512] = "";
    char   id[64];
    char * sep = " `~!@#$%^&*()+|\\=-[]{};:/?.><,"; 
    char * p;
    ifstream in("input.txt");
    ofstream out("output.txt");
    
    if(in.is_open() && out.is_open())
    {
        while(in >> buf)
        {
            p = strtok(buf, sep);
            
            while(p != NULL)
            {                
                strcpy(id, " ");
                strcat(id, p);
                strcat(id, " ");
                
                if(!isKeyword(id) && isAlpha(id))
                {
                    if(!strstr(idArray, id))
                    {
                        strcat(idArray, id);
                        out << id + 1<< endl;
                    }
                }
                
                p = strtok(NULL, sep);                
            }
        }
    }
    
    in.close();
    out.close();
    
    return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)