Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение строк из файла 
V
    Опции темы
bullvinkle
Дата 15.10.2009, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



Добрый день.
У меня задание: есть файл с мнемониками ассемблера, надо читать этот файл и говорить мнемоника ли, или просто набор символов. Мнемоники могут начинаться не с начала файла.
Я пишу вот так:
Код

#include <stdlib>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
const struct
{
        char name [8];
        int code;
}
asm_mnems[]=
{
        {"add",37},
        {"mul",28},
        {"sub",43},
        {"jne",23}
};
int main (void)
{
        FILE *fp;
        char buf [1000];
        int i, j, n, k;
        fp = fopen("asm.txt","rt");
        if (fp == NULL)
        {
                printf("ERROR!/n");
                getch();
                exit(66);
        }
        while (fgets(buf, 1000, fp))
        {
                i=0;
                while (isspace(buf[i]))
                        i++;
                if (buf[i]=='\0')
                        continue;
                if (buf[i]==';')
                        continue;
                if (!isalpha(buf[i])&&
                        buf[i]!='_'&&
                        buf[i]!='@')
                 {
                        printf("Invalid character\n");
                        printf("%s\n", buf);
                        getchar();
                        exit(66);
                 }
                j=i;
                while ((isalpha (buf[i])
                        || buf[i]==' ' ||
                        buf[i]=='@')&& !isspace(buf[i]))
                        {
                             i++;
                         }
                buf[i]='\0';
                // вместо бинароного поиска - простой перебор
                for (int z = 0; z<sizeof(asm_mnems)/12; z++)
                {
                        if (stricmp(buf+j, asm_mnems[z].name)==0)
                                printf("ASM instruction: %s, code = %d \n",asm_mnems[z].name, asm_mnems[z].code);

                      //==================================================================
                        else      // Вот без этих строк работает все хорошо, но не удовлетворяет условиям здания
                                printf("User's label or mistake %s \n",buf);
                     //===================================================================
                }

        }

        fclose(fp);
        getchar();
        return 0;
}

Пробую запускать с вот таким файлом
Код




mul   
add

sub

olololo:

mul



  sub     
                 
          


mul

Если строку, которую я выделил в коде (62-65), убрать, то все работает как надо, т.е. распознает мнемоники. Но мне надо, что бы кроме мнемоник показывало что такая-то строка является просто набором символов, либо меткой. Поэтому я добавил ту строку. После чего получаю вот такой результат
Код

User's label or mistake mul
ASM instruction: mul, code = 28
User's label or mistake mul
User's label or mistake mul
ASM instruction: add, code = 37
User's label or mistake add
User's label or mistake add
User's label or mistake add
User's label or mistake sub
User's label or mistake sub
ASM instruction: sub, code = 43
User's label or mistake sub
User's label or mistake olololo
User's label or mistake olololo
User's label or mistake olololo
User's label or mistake olololo
User's label or mistake mul
ASM instruction: mul, code = 28
User's label or mistake mul
User's label or mistake mul
User's label or mistake sub
User's label or mistake sub
ASM instruction: sub, code = 43
User's label or mistake sub
User's label or mistake mul
ASM instruction: mul, code = 28
User's label or mistake mul
User's label or mistake mul



Вобщем мне надо, что бы фразу User's label or mistake вывело только раз, когда встретит строку olololo
Что можно с этим поделать?
PM MAIL ICQ   Вверх
Nikituki
Дата 15.10.2009, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Нужно заменить строки с 57 по 67 на
Код

 for (int z = 0; z<sizeof(asm_mnems)/12; z++)
                {
                        if (stricmp(buf+j, asm_mnems[z].name)==0)
                            flag=z;
                }
if (flag!=-1)
                printf("ASM instruction: %s, code = %d \n",asm_mnems[flag].name, asm_mnems[flag].code);
else
                printf("User's label or mistake %s \n",buf);

PM MAIL   Вверх
bullvinkle
Дата 16.10.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



Nikituki, если сделать так, то не выводит один раз строку User's label or mistake olololo, т.к. это не мнемоника. Потому что строка 
Код

else
                printf("User's label or mistake %s \n",buf);

z не может быть -1
Вобщем результат тот же, что если бы я просто удалил строки 62-65.
PM MAIL ICQ   Вверх
Nikituki
Дата 16.10.2009, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Ой, забыл дописать перед циклом
Код

flag=-1;

Так все будет правильно работать
PM MAIL   Вверх
bullvinkle
Дата 16.10.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



Работает! Спасибо.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0698 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.