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


Автор: oguretzz 25.9.2006, 16:44
Допустим программа должна работать с файлом-библиотекой, такого типа: double double string. 
Т.е. например:
0.66 0.87 Cs-137
0.79 0.57 Cs-134
......и т.д.

Вопрос такое: как без анализа строки просто считать данные из такого файла?

Дело в том, я новичок в Java, а в C++ подобные вещи делал очень просто через оператор ">>". Таким образом не анализируя строку (это уже описано в операторной ф-ции ">>") просто считывал значения нужного типа. Есть подозрение что аналогичным образом можно действовать и в Java, но я пока не нашел подходящего способа. 

Прошу подсказать как это правильно делать в Java с наименьшими затратами.


Автор: LSD 25.9.2006, 16:53
Код
Scanner scanner = new Scanner(new File("input.txt"));
double d = scanner.nextDouble();
int i = scanner.nextInt();

Автор: powerOn 25.9.2006, 17:01
Допустим есть у нас такой txt файл:
Цитата

123 456 Hello
7890 12345 Test


Вот код программы нашей:
Код

import java.io.FileInputStream;
import java.util.Scanner;

public class NewClass {
    public NewClass() {
    }
    
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("newfile.txt");
            Scanner sc = new Scanner(fis);
            while(sc.hasNext()) {
            System.out.println("int = " + sc.nextInt()); 
            System.out.println("int = " + sc.nextInt());
            System.out.println("string = " + sc.next());
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}


Вот результат её выполнения:
Цитата

int = 123
int = 456
string = Hello
int = 7890
int = 12345
string = Test


Добавлено @ 17:02 
Оперэдыли!!!

Автор: LSD 25.9.2006, 22:57
Цитата(powerOn @  25.9.2006,  18:01 Найти цитируемый пост)
Вот код программы нашей:

Маленькое дополнение, я в своем примере не написал, и тут тоже не указанно, но потоки надо закрывать за собой.
Код
scanner.close();

Автор: ma_lover 25.8.2007, 14:37
powerOn, добрый день.

Поддерживает ли Ваш вариант программы с использованием метода Scanner чтение арифметических операций?
Когда я ввёл в текстовом файле знаки арифметических операций, то стектрейс вывел следующее:

java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:819)
    at java.util.Scanner.next(Scanner.java:1431)
    at java.util.Scanner.nextInt(Scanner.java:2040)
    at java.util.Scanner.nextInt(Scanner.java:2000)
    at NewClass.main(NewClass.java:13)


Заранее спасибо.

Автор: LSD 26.8.2007, 08:40
Цитата(ma_lover @  25.8.2007,  15:37 Найти цитируемый пост)
Поддерживает ли Ваш вариант программы с использованием метода Scanner чтение арифметических операций?

Смотря что подразумевать под чтением арифметических операций. Если нужно прочитать сами знаки этих операций, то да поддерживает. Их надо читать через next(). А если надо провести вычисления по этим операциям, то тут уже нужно использовать скриптовые языки, типа BeanShell.

Автор: ma_lover 26.8.2007, 08:48
нужно счиать сами знаки для начала..а потом провести вычисления по этим операциям, но для этого я хочу написать свой алгоритм. Не могли бы вы дать небольшой пример с методом next , чтобы было понятнее.
Спасибо.

Автор: LSD 26.8.2007, 08:56
Вот слегка модифицированный пример powerOn:
Код

import java.io.*;
import java.util.*;

public class Scan
{
  public static void main(String[] args)
  {
    try
    {
      FileInputStream fis = new FileInputStream("file.txt");
      Scanner sc = new Scanner(fis);
      while(sc.hasNext())
      {
        System.out.println(sc.nextInt()); 
        System.out.println(sc.next());
        System.out.println(sc.nextInt());
      }
      fis.close();
    }
    catch(Exception ex)
    {
      ex.printStackTrace();
    }
  }
}

Код

12 + 5
13 * 7

Автор: Kisja 17.12.2007, 11:43
Цитата(powerOn @ 25.9.2006,  17:01)


Сканер - это хорошая штука, только вот мне нужно прочитать данные из строк такого типа:
Цитата

      1                 54782   ИВАНОВ СЕРГЕЙ ПЕТРОВИЧ                           446.43  100385


где 446.43 - число типа double.

Для чтения пробую использовать код:
Код

            Scanner sc = new Scanner(inStr);
            String rest, k;
            Double v;
            rest = sc.next();
            k = sc.next();
            rest = sc.next();
            rest = sc.next();
            rest = sc.next();
            v = sc.nextDouble();
            ...


При чтении значения v = sc.nextDouble(); получаю ошибку java.util.InputMismatchException (не совпадает тип). Когда число записано как 446,43 (с запятой вместе точки), то сканер воспринимает его как double. Как быть?


Автор: Kangaroo 17.12.2007, 12:33
Kisja, Scanner использует текущую локаль для определения формата чисел. Поэтому вам нужно задать локаль, в которой вещественные числа через точку.
Попробуйте вот так:
Код

Scanner s = new Scanner("34.56");
        s.useLocale(Locale.US);
        s.nextDouble();
s.close();

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