Odczyt z klawiatury i zapis do pliku txt

0

Witam,

Mam pewien problem z swoim programem który próbuje napisać. Otóż chcę odczytywać liczby double z klawiatury które będą zapisywane do pliku txt. Lecz jeśli wprowadzone będzie 0 to zostanie dodana nowa linia do pliku txt. Lecz niestety ten program ciągle zapisuje do pliku 0.0 bez względu na wartość. Dlaczego tak się dzieje? Jak to naprawić?

Poniżej mój kod:

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

public class Main {

	static double liczbaZmiennoprzecinkowa;
	
	public static void main(String[] args) throws IOException{
		while(true){
			if(liczbaZmiennoprzecinkowa == 0.0){
				odczytZklawiatury(liczbaZmiennoprzecinkowa);
				zapisDoPliku("0.0");
			}
			else{
				zapisDoPliku(String.valueOf(liczbaZmiennoprzecinkowa));
			}
				
		}
	}
	public static void odczytZklawiatury(Double liczbaZmiennoprzecinkowa) {
		try{
		Scanner czytajZklawiatury = new Scanner (System.in);
		System.out.println("Podaj liczbę zmiennoprzecinkową:");
		liczbaZmiennoprzecinkowa = czytajZklawiatury.nextDouble();
		}
		catch (InputMismatchException e){
			System.out.print("Niepoprawna wartość!\n");			
			return;			
		}
	}
	public static void zapisDoPliku (String wartosc) throws IOException {
		
		FileWriter plikTxt = new FileWriter("zadanie1.txt",true);
		if(wartosc == String.valueOf(0.0)){
			try{				
				plikTxt.write("\n");
				plikTxt.close();
				}
				catch(IOException e){
					System.out.print("Błąd!");
					return;
				}
		}
		else if(wartosc != String.valueOf(liczbaZmiennoprzecinkowa)){
			try{				
				plikTxt.write(String.valueOf(liczbaZmiennoprzecinkowa+" "));
				plikTxt.close();
				}
				catch(IOException e){
					System.out.print("Błąd!");
					return;
				}
		}
		
	}
}	
0

Powinno się strzelać po łapach za używanie == dla liczb zmiennoprzecinkowych.

1

Za wielokrotne tworzenie obiektu typu Scanner i wielokrotne otwieranie pliku należy się kolejna seria z KM po łapkach.

0

Hmm... To może coś poradzicie? Jak zrobić aby nie użyć?

0

Ten program ma więcej błędów i usterek niż linijek kodu. Napisz go od nowa. Mała wskazówka, nigdzie nie zmieniasz wartości pola liczbaZmiennoprzecinkowa. Na starcie jest 0.0 i tak zostaje do końca programu.

0

W takim wypadku formuła

 liczbaZmiennoprzecinkowa = czytajZklawiatury.nextDouble();

jest błędna?

Chciałem aby wartość odczytana była zapisana do liczbaZmiennoprzecinkowa a następnie w drugiej funkcji zapisDoPliku była zapisana.
Czy moje rozumowanie jest błędne?

0

Gdyby funkcja czytająca miała taka sygnaturę:

 public static void odczytZklawiatury()

, to Twoje rozumowanie byłoby poprawne. Ale sygnatura jest taka:

 public static void odczytZklawiatury(Double liczbaZmiennoprzecinkowa)

W ciele metody istnieje zmienna lokalna o nazwie liczbaZmiennoprzecinkowa. Przypisanie

liczbaZmiennoprzecinkowa = czytajZklawiatury.nextDouble();

dotyczy tej zmiennej lokalnej, a w porównaniu

if(liczbaZmiennoprzecinkowa == 0.0)

wykorzystywane jest pole klasy.
Jeszcze raz napiszę, kod ma tyle błędów i usterek, że nie ma sensu go naprawiać. Napisz kod od nowa.

0

Napisałem program który zapisuje mi wartości do txt. I wypisuje nawet dobrze:)
Tylko jak teraz się odnieść do tego? Że jeżeli wpiszę 0 to doda mi nową linię w pliku, bez wpisywania 0 do pliku txt?
Oraz aby nie użyć == dla liczb zmiennoprzecinkowych?

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

public class Main {

	static double liczbaZmiennoprzecinkowa;
	
	public static void main(String[] args) {
		while(true){
		odczytZklawiatury();
		zapisDoPliku();		
		}
	}
	public static void odczytZklawiatury() {		
		Scanner czytajZklawiatury = new Scanner (System.in);
		System.out.println("Podaj liczbę zmiennoprzecinkową:");
		liczbaZmiennoprzecinkowa = czytajZklawiatury.nextDouble();	
	}
	public static void zapisDoPliku () {		
		try{
		FileWriter plikTxt = new FileWriter("zadanie1.txt",true);			
		plikTxt.write(String.valueOf(liczbaZmiennoprzecinkowa+" "));
		plikTxt.close();	
		}
		catch (IOException e){
			System.out.println("Błąd!");
		}		
	}
}	 
1

Dopóki Ty nie usuniesz z programu:

  • nieskończonej pętli,
  • wielokrotnego tworzenia Scannera,
  • wielokrotnego otwierania i zamykania pliku
    to ja nie udzielę żadnej pomocy.
0

Zacząłem pisać od nowa...
Usunąłem pętle nieskończoną. Napisałem program który działa tylko raz. I mam ogromny problem z napisaniem pętli aby mi się program nie zatrzymywał oraz nie tworzył wielokrotnie Scannera oraz otwierał i zamykał plik. Może jakaś mała wskazówka co zrobić z tym kodem?

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

public class Main {
	
	static double liczbaZmiennoprzecinkowa;	
	
	public static void main(String[] args) {
		Scanner czytajZklawiatury = new Scanner (System.in);			
		System.out.println("Podaj liczbę zmiennoprzecinkową:");
		liczbaZmiennoprzecinkowa = czytajZklawiatury.nextDouble();	
		
		try{
			FileWriter plikTxt = new FileWriter("zadanie1.txt",true);				
			if(liczbaZmiennoprzecinkowa == 0){
				plikTxt.write("\n");	
			}
			else if(liczbaZmiennoprzecinkowa == -1){
				plikTxt.close();				
			}
			else{
				plikTxt.write(String.valueOf(liczbaZmiennoprzecinkowa + " "));	
			}			
		}
		catch(IOException e){
			System.out.println("Blad!");
		}			
	}
}	
0

Zakładam, że plik zadanie1.txt ma zawierać liczby tylko z ostatniego uruchomienia programu.

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

public class Main {
    static double liczbaZmiennoprzecinkowa;
    static Scanner czytajZklawiatury;
    static FileWriter plikTxt;

    public static void main(String[] args){
        try{
            plikTxt = new FileWriter("zadanie1.txt");
        }
        catch(IOException e){
            System.out.println("Blad! "+e.getMessage());
            System.exit(0);
        }
        Scanner czytajZklawiatury = new Scanner (System.in);
        while(true){
            System.out.println("Podaj liczbe (separatorem jest przecinek, -1 konczy program):");
            try{
                liczbaZmiennoprzecinkowa = czytajZklawiatury.nextDouble();
                if(piszDoPliku()){
                    break;
                }
            }
            catch(InputMismatchException e){
                czytajZklawiatury.next();
            }
        }
    }
    private static boolean piszDoPliku(){
        boolean end = false;
        try{
            if(liczbaZmiennoprzecinkowa == 0){
                plikTxt.write("\n");
            }
            else if(liczbaZmiennoprzecinkowa == -1){
                end = true;
                plikTxt.close();
            }
            else{
                plikTxt.write(liczbaZmiennoprzecinkowa + " ");
            }            
        }
        catch(IOException e){
            end = true;
            System.out.println("Blad! "+e.getMessage());
        }
        return end;
    }
}
0

Jakie to było proste:)
Dzięki wielkie za pomoc:)
Inaczej mi się teraz patrzy na wiele przykładów:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1