Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Чтение строк из файла


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

#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. 
Что можно с этим поделать?

Автор: Nikituki 15.10.2009, 20:51
Нужно заменить строки с 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);

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

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

z не может быть -1
Вобщем результат тот же, что если бы я просто удалил строки 62-65.

Автор: Nikituki 16.10.2009, 10:17
Ой, забыл дописать перед циклом
Код

flag=-1;

Так все будет правильно работать

Автор: bullvinkle 16.10.2009, 17:44
Работает! Спасибо.

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