2016-02-01 2 views
1

Файл Employee.txt содержит сведения о сотрудниках двух типов сотрудников, ежемесячно оплачиваемых и ежечасных выплатах. Файл содержит имя, фамилию, пол, ранг, тип и базовую зарплату в случае ежемесячно оплачиваемого сотрудника или почасовую ставку и количество отработанных часов в случае почасового работника. Образец файла приведен ниже:Чтение данных из текстового файла для вычисления и записи данных в другом текстовом файле

John Smiths M менеджер ежемесячный 45000,00

Сунил Bates M старший ежечасно 700,00 45

Eva Leung F офицерского ежемесячно 30500,00

Я должен написать программу который будет смотреть на каждого сотрудника и рассчитать бонус в процентах от базовой зарплаты. Для почасово оплачиваемого работника базовая зарплата берется как почасовая ставка, умноженная на количество отработанных часов в течение месяца. Если ранг является «офицером», бонусная ставка составляет 20%, а если звание выше или выше, бонус составляет 15%. Программа должна записать в новый файл TotalSalary.txt полную информацию о каждом сотруднике, а именно, имя, фамилию, пол и общую заработную плату (то есть с бонусом).

Вот как я работал его:

сотрудников Запись данных в классе текстовых файлов

public class files_qu1 { 

public static Formatter writein; 
private static Scanner sc; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    try{ 
     writein= new Formatter("Employees.txt"); 
    } 

    catch(SecurityException se){ 
     System.out.println("You do have access to this file"); 
     System.exit(1); 
    } 

    catch(FileNotFoundException fnfe){ 
     System.out.println("Error in creating file"); 
     System.exit(1); 
    } 

    Scanner sc= new Scanner(System.in); 

    String fname, lname, gender, rank, type; 
    double salary, t_sal, hours=0.0; 
    int num; 


    System.out.println("Enter num of employees"); 
    num= sc.nextInt(); 

    for(int i=0; i<num; i++){ 
     System.out.println("First name: "); 
     fname=sc.next(); 

     System.out.println("Last name: "); 
     lname=sc.next(); 

     System.out.println("Gender: "); 
     gender=sc.next(); 

     System.out.println("Rank: "); 
     rank=sc.next(); 

     System.out.println("Type: "); 
     type=sc.next(); 

     System.out.println("Salary: "); 
     salary=sc.nextDouble(); 

     if(type.equals("hourly")){ 
      System.out.println("Hours worked: "); 
      hours=sc.nextInt(); 

     } 


     writein.format(" %s %s %s %s %s %.2f %.2f\n",fname, lname, gender, rank, type, salary, hours); 
    } 

    sc.close(); 
    if(writein!=null){ 
     writein.close(); 
     } 


    } 

} 

Чтение и вычислительные данные из текстового файла сотрудников к тексту TotalSalary класс файлов

public class files_qu1read { 

private static Formatter writeToFile; 
private static Scanner sc; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    try { 
     sc= new Scanner(new File("C:/Users/Diksha/workspace/Java_Sem1/Employees.txt")); 
    } 

    catch 
     (FileNotFoundException fnfe){ 
      System.out.println("Error Creating File"); 
      System.exit(1); 
    } 

    String fname = null, lname, gender, rank, type; 
    double salary, t_sal = 0, hours; 


    while(sc.hasNext()){ 
     fname=sc.next(); 
     lname=sc.next(); 
     gender=sc.next(); 
     rank=sc.next(); 
     type=sc.next(); 
     salary=sc.nextDouble(); 
     hours=sc.nextDouble(); 

     if(type.equals("hourly")){ 

      t_sal= salary*hours; 

     } 

     if(type.equals("monthly")&&rank.equals("officer")){ 
      t_sal= salary*1.2; 

     } 

     if(type.equals("monthly")&&(rank.equals("senior")||rank.equals("manager"))){ 
      t_sal= salary*1.15; 

     } 

     try{ 
      writeToFile = new Formatter("TotalSalary.txt"); 
     } 
     catch (SecurityException se) { 
      System.out.println("You do have access to this file"); 
      System.exit(1); 
     } 
     catch (FileNotFoundException fnfe) { 
      System.out.println("Error Creating File"); 
      System.exit(1); 
     } 


     writeToFile.format("First name: %s Last name: %s Gender: %s Total Salary: %.2f",fname,lname, gender, t_sal); 
    } 



    sc.close(); 
    if(writeToFile!=null){ 
     writeToFile.close(); 
     } 


    } 

} 

В принципе, все работает отлично, что программа умеет писать в текстовый файл Employees, но когда дело доходит до чтения и записи данных в файл TotalSalary, записывается только имя последнего сотрудника, которое я написал в файле Employees в файл TotalSalary, а также его общую зарплату.

То есть, если файл Employees.txt имеет такие данные, как:

Райли Фокс е менеджер ежемесячно 45000,00 0,00

Эмили Рот е офицер ежечасно 10000,00 8,00

В TotalSalary.txt, то данные показываются только для этого последнего сотрудника, который:

имя: Emily Фамилия: Roth Пол: F Общая зарплата: 80000,00

+0

Я никогда не использовал 'Formatter', чтобы писать материал, но, вероятно, [этот ответ] (http://stackoverflow.com/a/4526103/1094430) может вам помочь. – StepTNT

+0

@StepTNT Спасибо большое! – Tia

ответ

1

Каждый раз, когда вы создаете Formatter для записи, файл создается или перезаписывается. Таким образом, любой контент теряется. Пожалуйста, ознакомьтесь с Javadoc:

  • @param имя_файла
    • Имя файла, используемого в качестве пункта назначения этого
    • форматировщиком. ** Если файл существует, он будет усечен до
    • нулевой размер; в противном случае будет создан новый файл **.Выход
    • будет записан в файл и буферизирован.

Вы можете создать форматировщик вне цикла

try{ 
     writeToFile = new Formatter("TotalSalary.txt"); 
    } 
    catch (SecurityException se) { 
     System.out.println("You do have access to this file"); 
     System.exit(1); 
    } 
    catch (FileNotFoundException fnfe) { 
     System.out.println("Error Creating File"); 
     System.exit(1); 
    } 
while(sc.hasNext()){ 

...

и не использовать его до конца программы и, наконец, закрыть его. Вы всегда можете использовать формат try-with-resources.

+0

Большое спасибо. Это было очень полезно :-) – Tia

Смежные вопросы