Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > не могу прочитать файл


Автор: Dastish_Fantastish 4.12.2007, 17:00
Вот такая проблема: надо прочитать файл и узнать, являются ли первые 2 символа цифрами или нет. Прога запускается, результата нет, только пишет вот такую ошибку: java.lang.ArrayIndexOutOfBoundsException: 20 at P479.main(P479.java:15).
Кстати, на с++ прога нормально работает. Содержимое файла 68abc
Код

import java.io.*; 
class P479
{
public static void main(String[] args)
{
try
{
FileReader fr=new FileReader("C:\\J_docs\\lab5\\numbers.txt");
String s=new String();
int n,x,y,z,b,c;
char[] a=new char[20];
n=0;
while (fr.read()!=1)
{
a[n]=(char)(fr.read());
n=n+1;
}
fr.close();
b=(int)(a[0]);
c=(int)(a[1]);
if ((b>=48)&(b<=57)&(c>=48)&(c<=57))
{
System.out.println("Perviye 2 simvola - cifri");
s.valueOf(a[0]);
x=Integer.parseInt(s);
System.out.println("1 cifra: "+x);
s.valueOf(a[1]);
y=Integer.parseInt(s);
System.out.println("2 cifra: "+y);
z=10*x+y;
if (z%2==0) System.out.println("Chislo chetnoye");
else System.out.println("Chislo ne chetnoye");
}
else System.out.println("Perviye 2 simvola ne cifri");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}






Автор: Kangaroo 4.12.2007, 17:23
У тебя не влезает файл в массив
Код

char[] a=new char[20];

Мало ему места.

Автор: Dastish_Fantastish 4.12.2007, 17:50
Так там всего-то 5 символов! Попробую увеличить размер массива

Добавлено через 5 минут и 2 секунды
Увеличил до 50 - не получается

Автор: Kangaroo 4.12.2007, 17:58
Ok. То был быстрый взгляд. Сейчас разберем.
Код

while (fr.read()!=1)  //что за проверка такая? почему 1? 
{
a[n]=(char)(fr.read());  //ты читаешь БАЙТ, а записываешь в ЧАР, а это 2 байта. Несоответствие получается.
n=n+1;
}

Я так думаю у тебя бесконечный цикл получается.

Автор: Dastish_Fantastish 4.12.2007, 18:21
Цитата

while (fr.read()!=1)  //что за проверка такая? почему 1? 

Это у меня что-то вроде аналога в с++ while(!feof(f)). Просто в одной книге прочитал, что метод read когда доходит до конца файла, возвращает 1. Наверное, надо по-другому делать.

Цитата

//ты читаешь БАЙТ, а записываешь в ЧАР, а это 2 байта. Несоответствие получается.

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

Автор: Kangaroo 4.12.2007, 18:37
Вот этот пример считывает файл построчно и печатает их в консоль
Код

                                BufferedReader br = null;
        String line = null;
        try {            
            br = new BufferedReader(new FileReader(new File("DATA.TXT"));  //open file
            while ((line = br.readLine()) != null) {  //read until end of file
                out.println(line);
            }
            br.close();
        }
        catch (FileNotFoundException fnfe) {
            System.err.println("File not found");
        }
        catch (IOException ioe) {
            System.err.println("Some unknown IOError: "+ioe.getLocalizedMessage());
            ioe.printStackTrace();
        }


Автор: Dastish_Fantastish 4.12.2007, 19:13
Все работает, строка читается! Спасибо еще раз! smile 

Автор: Dastish_Fantastish 4.12.2007, 19:50
Кстати, чуть не забыл, можешь еще написать, как построчно выполнить запись в файл примерно этим же методом?

Автор: dual 4.12.2007, 20:49
Вот так можно:
Код

FileOutputStream fos = new FileOutputStream( "somefile" );
PrintStream ps = new PrintStream(fos);
ps.println("string 1");
ps.println("string 2");
ps.close();

p.s. За синтаксическую правильность кода не ручаюсь, так как его не проверял, писал по памяти.

Автор: Dastish_Fantastish 5.12.2007, 12:34
Спасибо, надо попробывать!

Автор: LSD 5.12.2007, 12:50
Цитата(Dastish_Fantastish @  4.12.2007,  18:21 Найти цитируемый пост)
Просто в одной книге прочитал, что метод read когда доходит до конца файла, возвращает 1.

Если там действительно так написано, то выкини эту книгу. На самом деле возвращается -1, да и в JavaDoc по методу read() это написано.

Автор: AlexeyVorotnikov 5.12.2007, 12:51
Цитата(Dastish_Fantastish @  4.12.2007,  18:21 Найти цитируемый пост)
Просто в одной книге прочитал, что метод read когда доходит до конца файла, возвращает 1.

Он возвращает -1, не 1.

Kangaroo, 
Код

while (fr.read()!=1)  //что за проверка такая? почему 1? 
{
a[n]=(char)(fr.read());  //ты читаешь БАЙТ, а записываешь в ЧАР, а это 2 байта. Несоответствие получается.
n=n+1;
}

FileReader.read() читает символ, а не байт.

Автор: Kangaroo 5.12.2007, 13:28
Цитата(AlexeyVorotnikov @  5.12.2007,  11:51 Найти цитируемый пост)
FileReader.read() читает символ, а не байт. 

Да, извиняюсь. Действительно:
Цитата

Read a single character.


Писал по памяти, но все равно недопустительная ошибка. Перепутать byte и character стримы.. 
Спасибо.

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