Ввод Java-файла и манипулирование данными для вывода в файл
Привет! Итак, постарайтесь работать с программой, которая читает данные упражнений из текстового файла и печатает сводку этих данных в другом текстовом файле. Входной файл состоит из нескольких записей примера ввода из файла txt выглядит так:
1) Joe Schmoe
76.5 20 30 25 10 75.9
Jilly Momilly Schmill
50.5 30 30 35 37 28 32 35 34 34 49.2
Gail Quail
62.3 15 17 10 3 10 63.6
Frank Crank
83.2 5 83.2
John Quann
57.9 30 32 35 32 30 57.2
моя проблема в том, что я не могу заставить свой код читать каждого человека, я могу только заставить его прочитать первый или отправить меня в бесконечный цикл или несоответствие ввода. вот мой код:
`//Doubler.java
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.InputMismatchException;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.io.PrintWriter;
import java.util.Scanner;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.EOFException;
import java.io.IOException;
public class ExerciseSummary
{
private Scanner inputStream = null;
private PrintWriter outputStream = null;
private int next = 0;
private int sum = 0;
private int count = 0;
private double avg = 0;
private double firstWeight = 0;
private double lastWeight = 0;
private String line;
public static void main(String[] args)
{
ExerciseSummary summary = new ExerciseSummary();
summary.connectToInputFile();
summary.connectToOutputFile();
summary.summaryData();
summary.closeFiles();
System.out.println("\nAll numbers from the input file have been");
System.out.println("summarized and copied to the output file.");
}
public void connectToInputFile()
{
String inputFileName = getFileName("\nEnter name of input file: ");
try
{
inputStream =
new Scanner(new File(inputFileName));
}
catch(FileNotFoundException e)
{
System.out.println("File " + inputFileName + " not found.");
System.exit(0);
}
catch(IOException e)
{
System.out.println("Error opening input file " + inputFileName);
System.exit(0);
}
}
private String getFileName(String prompt)
{
String fileName = null;
System.out.print(prompt);
Scanner keyboard = new Scanner(System.in);
fileName = keyboard.next();
return fileName;
}
public void connectToOutputFile()
{
String outputFileName = getFileName("Enter name of output file: ");
try
{
//outputStream = new PrintWriter(outFile);
outputStream =
new PrintWriter(outputFileName);
}
catch(IOException e)
{
System.out.println("Error opening output file " + outputFileName);
//System.out.println(e.getMessage());
System.exit(0);
}
}
public void summaryData()
{
try
{
while (inputStream.hasNext());
{
line = inputStream.nextLine();
firstWeight = inputStream.nextDouble();
while (inputStream.hasNextInt())
{
sum += inputStream.nextInt();
count ++;
avg = (sum/count);
}
lastWeight = inputStream.nextDouble();
outputStream.println(line + " " + firstWeight + " " + sum + " " + count + " " + lastWeight + " " + avg + " " + (lastWeight-firstWeight));
}
}
catch (InputMismatchException e)
{
System.out.print(e);
System.exit(0);
}
}
public void closeFiles()
{
inputStream.close();
outputStream.close();
}
}
Выходная запись является сводкой входной записи. Он состоит из четырех значений, разделенных TAB: количество дней данных для этого участника, общее количество упражнений в минутах, среднее количество упражнений в день и общий потерянный вес (который будет отрицательным, если участник набрал вес), Имя было прочитано, но не распечатано (мы анонимизируем данные). Для записи выше, имя субъекта было Джо Шмо, и его стартовый вес был 76,5 кг. Джо занимался четырьмя днями (между начальным и конечным весом четыре значения int), всего 85 минут (20 + 30 + 25 + 10 = 85). Его конечный вес был 75,9 кг. Выходная запись: 4 85 21,25 0,5999999999999943
я ломал голову в течение двух недель, любая помощь будет очень признательна, спасибо
1 ответ
Бесконечный цикл:
while (inputStream.hasNext());
{
line = inputStream.nextLine();
firstWeight = inputStream.nextDouble();
while (inputStream.hasNextInt())
{
sum += inputStream.nextInt();
count ++;
avg = (sum/count);
}
lastWeight = inputStream.nextDouble();
outputStream.println(line + " " + firstWeight + " " + sum + " " + count + " " + lastWeight + " " + avg + " " + (lastWeight-firstWeight));
}
";" после "while (inputStream.hasNext())" - пустое выражение, поэтому java просто выполняет ";" в то время как inputStream.hasNext () и не использовать файл
Следующая проблема, InputMissmatchException: вам нужна эта строка для сканера:
inputStream =
new Scanner(new File("C:\\Test\\readTest.txt"));
inputStream.useLocale(Locale.ENGLISH);//this will help to interpret "." as decimal character
и последняя проблема, вам нужны эти 2 строки в конце while, чтобы использовать символ "новой строки":
lastWeight = inputStream.nextDouble();
outputStream.println(line + " " + firstWeight + " " + sum + " " + count + " " + lastWeight + " " + avg + " " + (lastWeight-firstWeight));
if(inputStream.hasNext())
inputStream.next(); // or even inputStream.nextLine();
теперь я получаю от первого лица: Joe Schmoe 76,5 85 4 75,9 21,0 -0,5999999999999943 это правильный результат?