Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с чтением из файла, Проблема при чтении из файла 
:(
    Опции темы
Zita
  Дата 3.6.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет! Делаю на J2ME что-то типа авторизации. Читаю из файла следующие данные - кол-во пользователей(один раз), пользователь, его пароль. Если всего 1 пользователь, то у меня все работает, а если больше одного тогда не хочет.
Вот код:
Код

String str = getText("/config.ini"); //Грузим файл конфигурации в строковую переменную
            String LoginNameTemp,PassTemp,tmp;
            
            int i0 = 0, i = 0, sizeconf, colusers = 0, j;
            i = str.indexOf("|",i0+1); //Ищем символ "|" в строке, начиная с i0+1 буквы
            tmp = str.substring(i0, i);
            i0 = i;
            Alert TempAlert1 = new Alert("i",tmp,null,null);
            mydisplay.setCurrent(TempAlert1);
            sizeconf = (int)Integer.parseInt(tmp);
            for(j=0;j<sizeconf;j++)
            {
                i = str.indexOf("|",i0+1); //Ищем символ "|" в строке, начиная с i0+1 буквы
              //  tmp = str.substring(i0, i);
                LoginNameTemp = str.substring(i0,i); //Выделяем часть строки с i0 по i-ый символ
                Alert TempAlert = new Alert("LoginNameTemp",LoginNameTemp,null,null);
                mydisplay.setCurrent(TempAlert);
               // tmp = Integer.toString(i);
               // tmp = Integer.toString(i);
               // Alert TempAlert1 = new Alert("i",tmp,null,null);
              //  mydisplay.setCurrent(TempAlert1);
                i0=i;
                i = str.indexOf("|",i0+1); //Ищем следующий символ
                PassTemp = str.substring(i0+1,i);
                if ((LoginName.equals(LoginNameTemp)) && (Pass.equals(PassTemp)))
                {
                    // Alert myAlert = new Alert("Login OK",LoginName,null,null);
                    // mydisplay.setCurrent(myAlert);
                    getMenu();            
                }

public String getText(String path)
    {
        DataInputStream dis = new DataInputStream(getClass().getResourceAsStream(path));
        StringBuffer strBuff = new StringBuffer();       
        int ch = 0;
        try {
            while ((ch = dis.read()) != -1) 
            {
                strBuff.append((char) ((ch >= 0xc0 && ch <= 0xFF) ? (ch + 0x350) : ch));
            }
            dis.close();
        } 
        catch (Exception e) 
        {
            System.err.println("ERROR in getText() " + e);
        }
        return strBuff.toString();
    }


Помогите плиз советом. Заранее спасибо.
PM MAIL   Вверх
Dummy
Дата 3.6.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если цикл заканчивается после 30-й строчки, то проблема в том, что после строчки 24 ты не обновляешь значение переменной i0. Поэтому на 1-й итерации считается пара "логин#0-пароль#0" (правильно), на 2-й считается пара "пароль#0-логин#1"(неправильно), на 3-й - пара "логин#1-пароль#1" (по форме правильно, но по смыслу здесь уже должно было быть  "логин#2-пароль#2"и т. д.
PM MAIL   Вверх
Zita
Дата 3.6.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Dummy @ 3.6.2008,  22:03)
Если цикл заканчивается после 30-й строчки, то проблема в том, что после строчки 24 ты не обновляешь значение переменной i0. Поэтому на 1-й итерации считается пара "логин#0-пароль#0" (правильно), на 2-й считается пара "пароль#0-логин#1"(неправильно), на 3-й - пара "логин#1-пароль#1" (по форме правильно, но по смыслу здесь уже должно было быть  "логин#2-пароль#2"и т. д.

Поставил после 
PassTemp = str.substring(i0+1,i);
i0 = i;
Но все равно не работает при вводе правильного логина и пароля.
Вот полный код обработки ввода:

Код

if (c == LoginOK)
        {
            LoginName = tfl.getString();
            Pass = tfp.getString();
            //String Temp = "A";
            //String Temp1 = "2";
            //Прочитаем из текстового файла строку
            String str = getText("/config.ini"); //Грузим файл конфигурации в строковую переменную
            String LoginNameTemp,PassTemp,tmp;
            
            int i0 = 0, i = 0, sizeconf, colusers = 0, j;
            i = str.indexOf("|",i0+1); //Ищем символ "|" в строке, начиная с i0+1 буквы
            tmp = str.substring(i0, i);
            i0 = i;
            Alert TempAlert1 = new Alert("i",tmp,null,null);
            mydisplay.setCurrent(TempAlert1);
            sizeconf = (int)Integer.parseInt(tmp);
            for(j=0;j<sizeconf;j++)
            {
                i = str.indexOf("|",i0+1); //Ищем символ "|" в строке, начиная с i0+1 буквы
              //  tmp = str.substring(i0, i);
                LoginNameTemp = str.substring(i0,i); //Выделяем часть строки с i0 по i-ый символ
                Alert TempAlert = new Alert("LoginNameTemp",LoginNameTemp,null,null);
                mydisplay.setCurrent(TempAlert);
               // tmp = Integer.toString(i);
               // tmp = Integer.toString(i);
               // Alert TempAlert1 = new Alert("i",tmp,null,null);
              //  mydisplay.setCurrent(TempAlert1);
                i0=i;
                i = str.indexOf("|",i0+1); //Ищем следующий символ
                PassTemp = str.substring(i0+1,i);
                i0 = i;
                if ((LoginName.equals(LoginNameTemp)) && (Pass.equals(PassTemp)))
                {
                    // Alert myAlert = new Alert("Login OK",LoginName,null,null);
                    // mydisplay.setCurrent(myAlert);
                    getMenu();            
                }
               /* else
                {
                    Alert myAlert1 = new Alert("Error Login or Pass",tmp,null,null);
                    mydisplay.setCurrent(myAlert1);
                }*/
            } 
            Alert myAlertj = new Alert("j",Integer.toString(j),null,null);
            mydisplay.setCurrent(myAlertj); 
        }
        System.out.println(LoginName);
        throw new UnsupportedOperationException("Not supported yet.");
    }

PM MAIL   Вверх
Dummy
Дата 3.6.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

throw new UnsupportedOperationException("Not supported yet.");


Шикарно smile  Все сделали, обработали, а потом взяли и выкинули Exception. JVM явно такой подлости из кода обработки команды не ждет smile Это, возможно, код, который остался от заглушки, что тебе какой-нибудь IDE вроде NetBeans сгенерировал?
PM MAIL   Вверх
Zita
Дата 3.6.2008, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Dummy, этот код сгенерировал NetBeans. Т.е. получается throw new UnsupportedOperationException("Not supported yet."); надо удалить??? Спасибо за советы.

UPD: Закоментировал эту строку и все равно не пашет.
 После ввода попадаю сюда -  
Alert myAlertj = new Alert("j",Integer.toString(j),null,null);
mydisplay.setCurrent(myAlertj); 

Это сообщение отредактировал(а) Zita - 4.6.2008, 00:02
PM MAIL   Вверх
Dummy
Дата 4.6.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, конечно, нужно удалить. NetBeans генерирует заглушки методов, и по умолчанию метод просто выкидывает UnsupportedOperationException(), просто чтобы просигнализировать разработчику, что этот метод не реализован. Как правило, следует это удалить и написать свою реализацию, возможно, пустую. И, конечно, в твоем случае этот эксепшн абсолютно ни к чему.
PM MAIL   Вверх
Zita
Дата 4.6.2008, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Dummy, все равно не работает - неправильно считывает из файла(у меня данные разделены |, захватывает разделитель). Посоветуй плиз нормальную среду для разработки приложения под J2ME, чтобы был хороший Debug, так как в NetBeans он вообще никакой и ничего нельзя проследить. Заранее спасибо.
PM MAIL   Вверх
Dummy
Дата 4.6.2008, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да все нормально должно быть в NetBeans Mobility, просто настроить надо. Правда, я по застарелой привычке пользуюсь IntelliJ Idea  smile - можешь тоже попробовать, может, понравится. Правда, я все пытаюсь начать пользовать Mobility - все никак не начну...  

Еще есть любители, которые Eclipse гоняют, но тут я не советчик - Eclipse никогда не использовал и пока не собираюсь.

А по поводу того, что считывает неправильно... Посмотри, что у тебя там с индексами творится - это уже, видимо, алгоритмическая ошибка, а не проблема собственно считывания из файла. Мне что-то уже лениво чужой код дебажить, не сердись уж smile 

Ты, кстати, опиши, хотя бы, что за ошибка-то. Как выглядит, что происходит, что не так.

Добавлено @ 01:26
Ну, собссно, еще один баг находится быстро.

Код

i = str.indexOf("|",i0+1);
LoginNameTemp = str.substring(i0,i);


нужно брать substring(i0, i - 1).

Я уж не говорю о том, что надо бы обрабатывать ситуацию, когда мы не находим очередного "|".  И даже не говорю о том, что будет, если в файле по какой-то причине будет идти, например, 2 слэша подряд. И совсем молчу о том, что такой код выполнять в commandAction() крайне не рекомендуется, ибо долгий он и блокирующий, да еще и IOException запросто схлопотать можно, что совсем уж чревато. Лучше запустить отдельный поток как-нибудь так:

Код

public void commandAction(Command c, Displayable d) {
    if (c == LoginOK) {
        new Thread() {
             public void run() {
                  // твой парсинг ini-файла
             }
        }.start();
    }
}


Это сообщение отредактировал(а) Dummy - 4.6.2008, 01:29
PM MAIL   Вверх
Zita
Дата 4.6.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Dummy, получается что при вводе правильного логина и пароля не проходит аутентификация.  И в этом коде
Код

 for(j=0;j<sizeconf;j++)
            {
                i = str.indexOf("|",i0+1); //Ищем символ "|" в строке, начиная с i0+1 буквы
              //  tmp = str.substring(i0, i);
                LoginNameTemp = str.substring(i0+1,i); //Выделяем часть строки с i0 по i-ый символ
                i0=i;
                i = str.indexOf("|",i0+1); //Ищем следующий символ
                PassTemp = str.substring(i0+1,i);
                i0 = i;
               // Alert TempAlert = new Alert("PassTemp",PassTemp,null,null);
              //  mydisplay.setCurrent(TempAlert);
                Alert TempAlert = new Alert("LoginNameTemp",LoginNameTemp,null,null);
                mydisplay.setCurrent(TempAlert);
               // tmp = Integer.toString(i);
               // tmp = Integer.toString(i);
               // Alert TempAlert1 = new Alert("i",tmp,null,null);
              //  mydisplay.setCurrent(TempAlert1);
           
                if ((LoginName.equals(LoginNameTemp)) && (Pass.equals(PassTemp)))
                {
                    // Alert myAlert = new Alert("Login OK",LoginName,null,null);
                    // mydisplay.setCurrent(myAlert);
                    getMenu();            
                }

я получаю последний логин. Т.е. первые логины в файле он пропускает???

PM MAIL   Вверх
Dummy
Дата 4.6.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Во-первых, я лажанул вот с этим советом:

Код

substring(i0, i - 1)


 smile

Правильно сейчас у тебя написано, надо брать substring(i0, i).

Вообще, покажи, как твой ini-файл выглядит (желательно приаттачить).

Затем, измени код так, чтобы каждый раз он выводил LoginNameTemp, PassTemp через System.out.println. Или проще поставить breakpoint на 19-й строчке.

Вот это в качестве отладочного лога никак не подходит:
Код

Alert TempAlert = new Alert("LoginNameTemp",LoginNameTemp,null,null);
mydisplay.setCurrent(TempAlert);

Т. к. действительно в итоге отобразится только алерт с последним логином, что ты и видишь)))
PM MAIL   Вверх
Zita
Дата 4.6.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Dummy, спасибо помогло - убрал алерты. Теперь все пашет. Подскажи плиз как вывести сообщение если пользователя нет в файле?? Если бы мог поставил бы +.
PM MAIL   Вверх
Dummy
Дата 4.6.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А вот здесь уже как раз пригодится Alert  smile 

Код

Alert msgAlert = new Alert("Login attempt failed", "User " + PassTemp + " not found or password doesn't match", null, AlertType.ERROR);

msgAlert.setTimeout(Alert.FOREVER);
msgAlert.setCurrent(msgAlert);


Только смотри, чтобы на момент исполнения этого кода текущим на экране был не Alert, иначе получишь IllegalArgumentException .
PM MAIL   Вверх
Zita
Дата 5.6.2008, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С одной проблемой помогли разобраться, но появилась другая. Я пишу программу для тестирования и сами вопросы читаю из файла. Первый вопрос читается хорошо, а дальше после обработки выбора ответа не получается вывести 2-й вопрос(остается на первом вопросе). Помогите плиз разобраться в чем трабла. Заранее спасибо.
Вот код:

Код

    
    public void startApp() 
    {
        mydisplay = Display.getDisplay(this);
        getLoginScreen();
    }
    
    public void getLoginScreen()
    {
        MyForm = new Form("LoginScreen");
        tfl = new TextField("Login","",20,TextField.ANY);
        MyForm.append(tfl);
        tfp = new TextField("Password","",20,TextField.PASSWORD);
        MyForm.append(tfp);
        MyForm.addCommand(LoginOK);
        MyForm.addCommand(exitMidlet);
        MyForm.setCommandListener(this);
        mydisplay.setCurrent(MyForm);
    }

    public void getMenu()
    {
        Menu = new List("Menu", Choice.IMPLICIT);
        Menu.append("Тесты", null);
        Menu.addCommand(exitMidlet);
        Menu.addCommand(OkCommand);
        Menu.setCommandListener(this);
        mydisplay.setCurrent(Menu);
    }
    
    public String getText(String path)
    {
        DataInputStream dis = new DataInputStream(getClass().getResourceAsStream(path));
        StringBuffer strBuff = new StringBuffer();       
        int ch = 0;
        try {
            while ((ch = dis.read()) != -1) 
            {
                strBuff.append((char) ((ch >= 0xc0 && ch <= 0xFF) ? (ch + 0x350) : ch));
            }
            dis.close();
        } 
        catch (Exception e) 
        {
            System.err.println("ERROR in getText() " + e);
        }
        return strBuff.toString();
    }
    
    public void getLogin()
    {
        LoginName = tfl.getString();
        Pass = tfp.getString();
        //Прочитаем из текстового файла строку
        strL = getText("/config.ini"); //Грузим файл конфигурации в строковую переменную
        String LoginNameTemp,PassTemp,tmp;
        int i0 = 0, i = 0, sizeconf, j, flaguser = 0;
        i = strL.indexOf("|",i0+1); //Ищем символ "|" в строке, начиная с i0+1 буквы
        tmp = strL.substring(i0, i);
        i0 = i;
        sizeconf = (int)Integer.parseInt(tmp);
        for(j=0;j<sizeconf;j++)
        {
            i = strL.indexOf("|",i0+1); //Ищем символ "|" в строке, начиная с i0+1 буквы
            LoginNameTemp = strL.substring(i0+1,i); //Выделяем часть строки с i0 по i-ый символ
            i0=i;
            i = strL.indexOf("|",i0+1); //Ищем следующий символ
            PassTemp = strL.substring(i0+1,i);
            i0 = i;
            if ((LoginName.equals(LoginNameTemp)) && (Pass.equals(PassTemp)))
            {
                flaguser = 1;
                getMenu();            
            }
        } 
        if (flaguser == 0)
        {
            Alert AlertErrorLogin = new Alert("Error Login or Pass","User " + LoginName + " not found or password doesn't match", null, AlertType.ERROR);    
            AlertErrorLogin.setTimeout(Alert.FOREVER);
            mydisplay.setCurrent(AlertErrorLogin);
            System.out.println("User not Register");
        }
    }
    
    public void getColQ()
    {
        //Прочитаем из текстового файла строку
        strT = getText("/tests.ini"); //Грузим файл конфигурации в строковую переменную
        String tmp;
        colansp = 0;
        colQTemp = 1;
        i = strT.indexOf("|",i0+1); //Ищем символ "|" в строке, начиная с i0+1 буквы
        tmp = strT.substring(i0, i);
        i0 = i;
        colQ = (int)Integer.parseInt(tmp);
        System.out.println(colQ);
        getTests();
    }
    
    public void getTests()
    {
        int TypeQ;
        String Q,ans1,ans2,ans3,ans4,tmp;
        if (colQTemp <= colQ)
        {
            i = strT.indexOf("|",i0+1); //Ищем символ "|" в строке, начиная с i0+1 буквы
            tmp = strT.substring(i0+1,i); //Тип вопроса
            TypeQ = (int)Integer.parseInt(tmp);
            i0=i;
            i = strT.indexOf("|",i0+1); //Ищем следующий символ
            Q = strT.substring(i0+1,i);//вопрос
            i0 = i;
            i = strT.indexOf("|",i0+1); //Ищем следующий символ
            ans1 = strT.substring(i0+1,i);//Вариант ответа №1
            i0 = i;
            i = strT.indexOf("|",i0+1); //Ищем следующий символ
            ans2 = strT.substring(i0+1,i);//Вариант ответа №2
            i0 = i;
            i = strT.indexOf("|",i0+1); //Ищем следующий символ
            ans3 = strT.substring(i0+1,i);//Вариант ответа №3
            i0 = i;
            i = strT.indexOf("|",i0+1); //Ищем следующий символ
            ans4 = strT.substring(i0+1,i);//Вариант ответа №4
            i0 = i;
            i = strT.indexOf("|",i0+1); //Ищем следующий символ
            tmp = strT.substring(i0+1,i);//Правильный ответ
            ansp = (int)Integer.parseInt(tmp);
            i0 = i;
            tmp = Integer.toString(colQTemp);
            colQTemp++;
            switch(TypeQ)
            {
                case 1 : Test1(Q,ans1,ans2,ans3,ans4, tmp); break;
            }
        }
        else
        {
            
        }
    }
    
    public void Test1(String Q, String ans1, String ans2, String ans3, String ans4, String n)
    {
        String [] ans = {ans1,ans2,ans3,ans4};
        groupEXCLUSIVE = new ChoiceGroup(Q,ChoiceGroup.EXCLUSIVE,ans,null);
        FormTests = new Form("Вопрос №" + n);
        FormTests.append(groupEXCLUSIVE);
        FormTests.addCommand(exitMidlet);
        FormTests.addCommand(viborTests1);
        FormTests.setCommandListener(this);
        mydisplay.setCurrent(FormTests);
    }
    
    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

    public void commandAction(Command c, Displayable d) {
        if (c == exitMidlet)
        {
            destroyApp(false);
            notifyDestroyed();
        }
        if (c == LoginOK)
        {
            getLogin();
        }
        if (c == OkCommand)
        {
            getColQ();
        }
        if (c == viborTests1)
        {
            int k = groupEXCLUSIVE.getSelectedIndex();
            if (k == ansp-1)
            {
                colansp++;
                Alert AlertErrorLogin = new Alert("Ans OK","Ans OK", null, AlertType.ERROR);    
                AlertErrorLogin.setTimeout(Alert.FOREVER);
                mydisplay.setCurrent(AlertErrorLogin);
                getTests();
            }
            else
            {
                getTests();
            }
                
        }
    }



PM MAIL   Вверх
Zita
  Дата 5.6.2008, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как надо обрабатывать ввод ответа и чтобы потом сразу выодились следующие вопросы?

Это сообщение отредактировал(а) Zita - 5.6.2008, 08:53
PM MAIL   Вверх
Zita
Дата 5.6.2008, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все сам нашел ошибку!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




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


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

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