I am stuck on my problem where I have to read a file given by the user and then calculate names, grades, and such. But the issue I am having is that I need to take that data and store it in a text file names report.txt and then take the data from the first file and then compute the averages of all the scores. I am having trouble outputting anything, but when I do System.out it prints out correctly but I don’t think I have correctly stored it in the report.txt file. Any help would be much appreciated. Code:
import java.util.Scanner;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.IOException;
public class LabProgram {
public static void main(String[] args) throws IOException {
Scanner scnr = new Scanner(System.in);
/* TODO: Declare any necessary variables here. */
FileInputStream fileByteStream = null; // File input stream
Scanner inFS = null; // Scanner object
FileOutputStream fileStream = null;
PrintWriter outFS = null;
String userInput = scnr.nextLine();
String firstName;
String lastName;
int midTerm1Score;
int midTerm2Score;
int finalScore;
int avgScore;
char letterGrade;
int midTerm1Total = 0;
int midTerm2Total = 0;
int finalTotal = 0;
double midTerm1Avg;
double midTerm2Avg;
double finalAvg;
int counter = 0;
/* TODO: Read a file name from the user and read the tsv file here. */
// Try to open file
fileByteStream = new FileInputStream(userInput);
inFS = new Scanner(fileByteStream);
/* TODO: Compute student grades and exam averages, then output results to a text file here. */
fileStream = new FileOutputStream("report.txt");
outFS = new PrintWriter(fileStream);
while (inFS.hasNext()) {
firstName = inFS.next();
lastName = inFS.next();
midTerm1Score = inFS.nextInt();
midTerm1Total = midTerm1Total + midTerm1Score;
midTerm2Score = inFS.nextInt();
midTerm2Total = midTerm2Total + midTerm2Score;
finalScore = inFS.nextInt();
finalTotal = finalTotal + finalScore;
avgScore = (midTerm1Score + midTerm2Score + finalScore) / 3;
if (avgScore >= 90) {
letterGrade = 'A';
}
else if ( avgScore >= 80) {
letterGrade = 'B';
}
else if (avgScore >= 70) {
letterGrade = 'C';
}
else if (avgScore >= 60) {
letterGrade = 'D';
}
else {
letterGrade = 'F';
}
outFS.println(firstName + " " + lastName + " " + midTerm1Score + " " + midTerm2Score + " "
+ finalScore + " " + letterGrade);
counter++;
}
midTerm1Avg = (double) midTerm1Total / counter;
midTerm2Avg = (double) midTerm2Total / counter;
finalAvg = (double) finalTotal / counter;
outFS.println("");
outFS.printf("Averages: Midterm1 %.2f", midTerm1Avg);
outFS.printf(", Midterm2 %.2f", midTerm2Avg);
outFS.printf(", Final %.2f", finalAvg);
outFS.close();
fileByteStream.close(); // close() may throw IOException if fails
} }
Advertisement
Answer
PrintWriter doesn’t directly write the data to disk. Instead, it stores the data in an internal buffer until flush() is called because writing a large chunk of data to disk at once is faster than repeatedly writing small portions of data. Call outFS.flush() before closing the PrintWriter.
BTW, it’s a good practice to put streams, writers etc. into try-with-resources blocks instead of closing them manually.