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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ввод и вывод из файла вещественных чисел 
V
    Опции темы
Vitaly333
Дата 28.2.2007, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Как в Java самым простым способом загрузить из файла массив вещественных чисел(double, float), и сохранить этот массив в другой файл.
PM MAIL   Вверх
RebornCrusader
Дата 28.2.2007, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если формат не оговаривается, можно использовать XML (ленивый я;). 
В случае простого текстового файла начните например c java.io.BufferedReader и StringTokenizer. 
Вывод - можно с использованием String Buffer и BufferedWriter.
Для преобразования из строки и в строку - соответствующие методы объектных оболочек Double и Float.
И достаньте какую-нибудь книжку по основам Java.


Это сообщение отредактировал(а) RebornCrusader - 28.2.2007, 07:14
--------------------
"Fais se que dois, - adviegne que peut. C'est commande au chevalier"
PM   Вверх
devmstr
Дата 28.2.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Вот я вам набросал пример. Вроде все что может вызвать вопросы, прокоментировал. Если что не понятно, спрашивайте.
Код

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

public class DoubleLoader 
{
    
    public static void main(String[] args) 
    {
        try
        {
            // Входной файл (in.txt)
            BufferedReader  in  = new BufferedReader(new FileReader("in.txt"));
            
            // Выходной файл
            BufferedWriter  out = new BufferedWriter(new FileWriter("out.txt"));
            
            //"Вещчь", которая поможет нам нормально все прочитать, пропуская пробелы и мусор
            Scanner sc = new Scanner(in);
            
            // Coздаем массив
            final int    MaxNum = 100;                 // Мах кол-во чисел в файле
                  double[] dAr  = new double[MaxNum];
            
                  int iRN     = 0;
            // Пока в файле есть еще вещественные числа
            while (sc.hasNextDouble())
            {            
                /* Вообще тут лучше сразу бы прям писать в файл, без всяких массивов
                   out.write(sc.nextDouble());
                 */
                // Ну а если через массив, тогда
                dAr[iRN++] = sc.nextDouble();
            }
            
            // Записываем массив в файл
            for (int it = 0; it < iRN; it++)
                out.write(dAr[it]+" ");
            
           sc.close();
           
           out.flush();         // Так как запись буфферезированная, то сбрасываем содержимое
           out.close();
           in.close();
            
        }
        
        catch(IOException ioe)
        // Eсли что, выводим ошибку
        {
            System.err.println("An error was occupied during input/output operation.");
        }
        
    }
    
}



--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
LSD
Дата 28.2.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Если формат файла бинарный, то:
Код
DataInputStream in = new DataInputStream(new FileInputStream("in-file"));
DataOutputStream out = new DataOutputStream(new FileOutputStream("out-file"));
try
{
  while(true)
    out.writeDouble(in.readDouble());
}
catch(EOFException e)
{
}
in.close();
out.close();

или
Код
FileInputStream in = new FileInputStream("in-file");
FileOutputStream out = new FileOutputStream("out-file");
FileChannel inChannel = in.getChannel();
DoubleBuffer inBuffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0L, inChannel.size()).asDoubleBuffer();
FileChannel outChannel = out.getChannel();
DoubleBuffer outBuffer = outChannel.map(FileChannel.MapMode.READ_WRITE, 0L, inChannel.size()).asDoubleBuffer();
outBuffer.put(inBuffer);
in.close();
out.close();



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Vitaly333
Дата 28.2.2007, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо. А можно как-нибудь через FileReader и FileWriter ?
PM MAIL   Вверх
devmstr
Дата 28.2.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Цитата(Vitaly333 @  28.2.2007,  20:59 Найти цитируемый пост)
А можно как-нибудь через FileReader и FileWriter

 smile  ээ, ну а как мой пример работает?? Разве не через FireReader&Writer?см.
BufferedReader получает как раз FileReader 



--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
Vitaly333
Дата 2.3.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

out.write(dAr[it]+" ");  - такое не проходит метод write(double a) с таким параметром не существует


Я написал так: 
Код

st=String.valueOf(dAr[it]+" ");
out.write(st+" ");        


И есчо проблемка:

Сканер читает только вещественные числа, записанные в такой форме: 24,424646
А вот так вот он уже отказывается читать: 24.424646

А в приведенном вами примере вещественные числа записываются через точку.
PM MAIL   Вверх
devmstr
Дата 3.3.2007, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Цитата(Vitaly333 @  2.3.2007,  22:24 Найти цитируемый пост)
out.write(dAr[it]+" ");

Поведения компилятора на данную строку зависит от его версии. В последних версиях, он видя прибавленную к действительному числу строку приводит сам и эту переменную к строке, так что проблем нет.
Ну как я понял проблема решилась...



Цитата(Vitaly333 @  2.3.2007,  22:24 Найти цитируемый пост)
Сканер читает только вещественные числа, записанные в такой форме: 24,424646
.
Ну тут все  просто. Что является разделяющим символов в вещественном числе определяется настройками самой системы. В одном случае точка это разделитель целой и дробной части, в то же время как запятая разделитель тысячь(56,500 - пятдесят шесть тысяч пятьсот).
У меня английская система стоит, поэтому разделитель точка. У Вас наверное русские настройки - отсюдого и разделитель ",".



--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
Vitaly333
Дата 3.3.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

У меня английская система стоит, поэтому разделитель точка. У Вас наверное русские настройки - отсюдого и разделитель ",".

Массив вещественных чисел сохраняется у меня с разделителем ".", а вот прочитать сканер может только вещественные числа с разделителем ",". Как заставить сканер читать вещественные числа с разделителем ".". Или может есть другой способ считывания вещественных чисел с разделителем "."?
PM MAIL   Вверх
devmstr
Дата 3.3.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Цитата(Vitaly333 @  3.3.2007,  19:45 Найти цитируемый пост)
Как заставить сканер читать вещественные числа с разделителем ".".

Пробуй так:
Код

sc.useLocale(new Locale("ru", "ru"));       //sc  - сканнер







--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
StyxR0CK
Дата 4.3.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



devmstr, только наверное en, а не ru. Т.к. для руской локали по умолчания разделитель ",", а для английской "."
PM MAIL   Вверх
Vitaly333
Дата 5.3.2007, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

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


 




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


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

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