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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с выводом через System.out.print 
:(
    Опции темы
Ybr
  Дата 14.3.2010, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.3.2010
Где: Москва

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



Здравствуйте!
Задание: дан файл, содержащий Фамилию, Имя человека (инициалы) и список книг, закрепленных за этим человеком. Необходимо вывести содержимое файла на консоль (это часть моего задания. Та часть, которая вызвала проблему).

Код:
Цитата

class DataBase {
    public void view_base() {/* выводит БД */
        BufferedReader in;// символьный поток для чтения
        String s;// буфер для чтения строк из файла
        String sub_s="";// подстрока строки s. Хранит  инициалы
        String result;// хранит только список книг
        int i=0;// счетчик

        try {
            in = new BufferedReader(new InputStreamReader
                    (new FileInputStream("C:\\...\\БД.txt")));


            while (in.ready()) {
                s = in.readLine();

                System.out.print(s+"\n");


                /*
                   for (i=0 ; i != s.indexOf("+") ; i++) {
                    System.out.print(s.charAt(i));
                    sub_s = sub_s+s.charAt(i);
                }
                result = s.substring(sub_s.length()-1);// удалили инициалы
                result = s.substring(2, s.length()-2);//удалили вспомогательные "++" вначале и вконце
                */


                System.out.print(s); sub_s = "";

            }
            in.close();
        }
        catch (IOException err) {
            System.out.println("\nПроизошла ошибка: "+err+"\nСкорее всего, файла не существует!");
        }
    }
    public void find_base (String data) {/* производит поиск по БД */

    }
    public void edit_base (String name, String surname, String books[]) {/* Редактирует БД */

    }
}
class Main {
    public static void main(String[] args) {
        DataBase work_base = new DataBase();// работа с базой данных
        
        work_base.view_base();
    }
}

(проблемный код я выделили цветом)

Содержимое файла БД.txt:
Код
Елена Черняева++Гомер. "Илиада" и "Одиссея":Энтони Троллоп. "Барсетширские хроники":Джейн Остин. "Гордость и предубеждение":Джонатан Свифт. "Приключения Гулливера"++
Олег Борнер++Шарлотта Бронте. "Джен Эйр":Лев Толстой. "Война и мир"++
Дим Эм++Чарльз Диккенс. "Дэвид Копперфильд":Уильям Тэккерей. "Ярмарка тщеславия":Гюстав Флобер. "Мадам Бовари":Джордж Элиот. "Миддлмарч"++

(На всякие вспомогательные символы не обращайте, пожалуйста, внимания)

Вывод программы:
Код
Елена Черняева++Гомер. "Илиада" и "Одиссея":Энтони Троллоп. "Барсетширские хроники":Джейн Остин. "Гордость и предубеждение":Джонатан Свифт. "Приключения Гулливера"++
Елена Черняева++Гомер. "Илиада" и "Одиссея":Энтони Троллоп. "Барсетширские хроники":Джейн Остин. "Гордость и предубеждение":Джонатан Свифт. "Приключения Гулливера"++Олег Борнер++Шарлотта Бронте. "Джен Эйр":Лев Толстой. "Война и мир"++
Олег Борнер++Шарлотта Бронте. "Джен Эйр":Лев Толстой. "Война и мир"++Дим Эм++Чарльз Диккенс. "Дэвид Копперфильд":Уильям Тэккерей. "Ярмарка тщеславия":Гюстав Флобер. "Мадам Бовари":Джордж Элиот. "Миддлмарч"++
Дим Эм++Чарльз Диккенс. "Дэвид Копперфильд":Уильям Тэккерей. "Ярмарка тщеславия":Гюстав Флобер. "Мадам Бовари":Джордж Элиот. "Миддлмарч"++


Я имею пока очень мало опыта в JAVA, поэтому в нижеследующих рассуждениях у меня нет полной уверенности.

В общем, в строке
Код
System.out.print(s+"\n");

Выводится только что считанная из файла строка (назовем ее Строка1). Далее идет закоментенный блок. Я сделал это намеренно, для чистоты эксперимента. После закомменченного блока идет строчка:
Код
System.out.print(s); sub_s = "";

То, что выводит эта строка, назовем Строка2. Скажите мне, пожалуйста, каким образом программе удается вывести что-то, отличное от Строки1?? Между Строка1 и Строка2 не происходит ровным счетом НИКАКИХ действий, однако переменной s каким-то образом удается измениться. Она приписывает к себе из ниоткуда следующую строку из файла. Ту самую, которая еще не считана!!
Как это происходит? Где я ошибся? Буду рад любому ответу.smile
PM MAIL   Вверх
casey
Дата 14.3.2010, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет ничего удивительного, если учесть,что

Код

                System.out.print(s+"\n");


- выводит строку s + символ перевода строки (\n)

Код

                System.out.print(s); sub_s = "";


- выводит ту же строку s (без символа новой строки) и после этого присваивает sub_s пустое значение

по ходу правильно будет так:


Код

            while (in.ready()) {
                s = in.readLine();

                System.out.print(s+"\n");


                /*
                   for (i=0 ; i != s.indexOf("+") ; i++) {
                    System.out.print(s.charAt(i));
                    sub_s = sub_s+s.charAt(i);
                }
                result = s.substring(sub_s.length()-1);// удалили инициалы
                result = s.substring(2, s.length()-2);//удалили вспомогательные "++" вначале и вконце
                */

                sub_s = "";
            }

PM MAIL WWW   Вверх
jk1
Дата 15.3.2010, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Скажите мне, пожалуйста, каким образом программе удается вывести что-то, отличное от Строки1

Обратите внимание на то, что в строке
Код

System.out.print(s);

отсутствует первод строки, поэтому следующая итерация цикла начинает вывод в той же самой строке. В результате на выходе получается:
Код

строка_1
строка_1строка_2
строка_2строка_3
...


Кстати, не стесняйтесь пользоваться System.out.println() - оно вернет каретку само, безо всяких усилий  с вашей стороны.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Ybr
Дата 15.3.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.3.2010
Где: Москва

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



Огромная благодарность jk1! Ситуация прояснилась, и все ошибки исчезли.
PM MAIL   Вверх
Ybr
Дата 15.3.2010, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.3.2010
Где: Москва

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



Столкнулся с новой проблемой.

Задание: имеется строка вида:
Цитата
Гомер. "Илиада" и "Одиссея":Энтони Троллоп. "Барсетширские хроники":Джейн Остин. "Гордость и предубеждение":Джонатан Свифт. "Приключения Гулливера":
Шарлотта Бронте. "Джен Эйр":Лев Толстой. "Война и мир":

Как видите, строка состоит из книг, разделенных знаком двоеточия (':'). Задача немного осложняется тем, что мы заранее НЕ знаем, сколько будет двоеточий в строке. Для решения этой проблемы я выбрал Vector.

Код, который разбивает исходную строку s на куски по ':':
(это только один из методов некоторого класса. Если есть желание - могу привести код целиком, но я считаю, что это - целесообразно)
Код

    public Vector split_books(String s) {/* Выдает вектор, каждая ячейка которого содержит 1 книгу */
        Vector vec = new Vector();// вектор книг
        String sub_s="";// подстрока
        int j1=0;// хранит прежнее значение j

        for (int i=0 ; i != s.length() ; i++) {
            if (s.charAt(i) == ':') {
                for (int j=j1 ; j < i ; j++) {
                    sub_s = sub_s+s.indexOf(j);
                }
                j1=i+1; vec.add(sub_s); sub_s = "";
            }
        }
        
        return vec;
    }

Код, который выводит полученные данные (он уже из другого класса и из другого метода, разумеется):
Код

        for (i=0 ; i < vec.size() ; i++) {
            sub_s = vec.get(i).toString();
            System.out.println(sub_s);
        }

Вывод программы:
Цитата

-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1
-1-1-1-16-17-1-1-1-1-1-1-1-1-1-1-15-1-1-1-1-1-1-1-1-1-1-127-1-1-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1

-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1
-1-1-1-18-117-1-1-1-1-1-1-1-1-1-1-115-1-1-1-1-1-1-1



Судя по количеству строк, операция деления по ':' производится успешно и безошибочно (в первом случае мы имеем 4 строки, в исходнике - 4 книги; во втором случае - 2 строки и 2 книги - в исходнике). Кроме того, перед выводом я преобразую содержимое vec в строку. Несмотря на все это, он почему-то выводит числовые данные.
Подскажите, пожалуйста, где я ошибся.
PM MAIL   Вверх
jk1
Дата 16.3.2010, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

он почему-то выводит числовые данные.

Он их выводит потому, что вы кладете в Vector числа, а не символы:
Код

 sub_s = sub_s+s.indexOf(j);
 
indexOf() возвращает позицию символа в строке или -1, если символа в строке нет. Обратите внимание, что передаете вы ему знаечние-переменной счетчика, разумеется в строке его нет. В вашем коде вместо indexOf() следует использовать charAt().

А вообще говоря, механизм разделения строк уже есть:
Код

Strin[] tokens = s.split(":");

Если требуется более сложный разбор, можно воспользоваться регулярными выражениями.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Ybr
Дата 16.3.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.3.2010
Где: Москва

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



Цитата

indexOf() возвращает позицию символа в строке или -1, если символа в строке нет. Обратите внимание, что передаете вы ему знаечние-переменной счетчика, разумеется в строке его нет. В вашем коде вместо indexOf() следует использовать charAt().

Этого оказалось достаточно, чтобы решить проблему. Просто заменить indexOf() на charAt(). Какая же глупая ошибка smile
PM MAIL   Вверх
Ybr
Дата 21.3.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.3.2010
Где: Москва

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



Столкнулся с очередной ошибкой. Сама ошибка понятна. Непонятно, почему она появляется.

(ошибка на выделенной строке)
Цитата
class Main {
    public static void main(String[] args)
            throws IOException {
        Menues show = new Menues();// вывод меню
        DataBase work_base = new DataBase();// работа с базой данных

        BufferedReader in;// символьный поток для чтения
        BufferedReader br = new BufferedReader (new InputStreamReader(System.in));// поток для чтения с консоли
        String s;// буфер для чтения строк из файла
        String find;// хранит поисковую строку
        int j;// хранит максимальную длину инициала
        int i;// переменная для case

        show.show_menue();
        System.out.print("Введите, пожалуйста, номер: "); i = System.in.read();

        switch (i) {
            case 49:
                // код, выводящий Базу. Работает без ошибок.
            case 50:
                System.out.println("Введите данные, по которым будет произведен поиск" +
                        "(это может быть имя, фамилия, книга [автор/название/часть названия и т.д.])");
                find = br.readLine();// !!ЗДЕСЬ ОШИБКА!!

                try {
                    in = new BufferedReader(new InputStreamReader (new FileInputStream
                            ("C:\\Users\\Михаил\\Desktop\\СПО\\Ruby\\Catalogue\\БД.txt")));

                    while (in.ready()) {
                        s = in.readLine();
                        work_base.find_base(s, find);
                    }
                    in.close();
                }
                catch (IOException err) {
                    System.out.println("\nПроизошла ошибка: "+err+"\nСкорее всего, файла не существует!");
                }
                break;
            case 51:
        }


В общем, на отмеченной строке (find = br.readLine();) почему-то не происходит записи того, что введено с консоли, в переменную find. Более того: когда я дебажил, то программа просто пропускала эту строку, и шла в try...catch. И там, разумеется, выдается ошибка "StringIndexOutOfBoundsException: String index out of range: 0" (т.к. в методе "find_base" есть обращение к строке find, по индексу 0. Поскольку эта строка пуста, то выдается ошибка.).
Подскажите, пожалуйста, в чем дело.

Это сообщение отредактировал(а) Ybr - 21.3.2010, 13:27
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




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


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

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