Typ char rzutowany na int w warunku "if"

0

Zastanawia minie dlaczego te dwa kody działają w różny sposób:

  1. to jest działanie pożadane (tak chciałem żeby zadziałało):
    screenshot-20200703122724.png
  2. ... a takie działanie mnie zaskoczyło:
    screenshot-20200703122855.png

... czy ma to coś wspólnego z opakowywaniem / automatycznym rzutowaniem?

1

Nie wiem co cie zaskoczyło ale nowa linia to nie 13 a 10.

0

OK, dziękuję ... zonk!!! numer 1
a teraz zonk!!! numer 2 >>> ... a dlaczego nie wyświetlają się znaki?

tak wygląda plik źródłowy:
screenshot-20200703125743.png

1

Ale jakie znaki?
Jakbyś pokazał cały kod, najlepiej go wkleił a nie robił screeny. Pokazał to co masz na wejściu, bo to jakiś plik chyba, napisał co chcesz na wyjściu to może i dałoby się coś odpowiedzieć. Na teraz to ci doradzę odpalić debugger.

0

Tak działa jak na pierwszym screen'ie:

import java.io.*;
public class FileReadExample {
public static void main(String[] args) throws IOException{
FileInputStream fileInput = null;
FileOutputStream fileOutput = null;
int buff;

    fileInput = new FileInputStream("C:\\Users\\tkar\\IdeaProjects\\" +
            "KompendiumJavaExamples\\out\\production\\KompendiumJavaExamples\\TestIn.txt");
    fileOutput = new FileOutputStream("C:\\Users\\tkar\\IdeaProjects\\" +
            "KompendiumJavaExamples\\out\\production\\KompendiumJavaExamples\\TestOut.txt");
    do {
        buff = fileInput.read();
        if(buff == 13) System.out.print("[ENTER]") ;
        System.out.print((char)buff);
        //if(buff == '\n') System.out.print("[ENTER]") ;
        fileOutput.write(buff);
    } while(buff != -1);
    fileInput.close();
    fileOutput.close();
}

}

Tak działa jak na 2 screen'ie:

import java.io.*;
public class FileReadExample {
public static void main(String[] args) throws IOException{
FileInputStream fileInput = null;
FileOutputStream fileOutput = null;
int buff;

    fileInput = new FileInputStream("C:\\Users\\tkar\\IdeaProjects\\" +
            "KompendiumJavaExamples\\out\\production\\KompendiumJavaExamples\\TestIn.txt");
    fileOutput = new FileOutputStream("C:\\Users\\tkar\\IdeaProjects\\" +
            "KompendiumJavaExamples\\out\\production\\KompendiumJavaExamples\\TestOut.txt");
    do {
        buff = fileInput.read();
        if(buff == '\n') System.out.print("[ENTER]") ;
        System.out.print((char)buff);
        //if(buff == '\n') System.out.print("[ENTER]") ;
        fileOutput.write(buff);
    } while(buff != -1);
    fileInput.close();
    fileOutput.close();
}

}

Obydwa kody różnią się linią:
if(buff == 13) System.out.print("[ENTER]") ;
if(buff == '\n') System.out.print("[ENTER]") ;

plik tekstowy źródłowy:

saasdasd
saadsdasd
asdasd
asdasd
asdasd

123

2

Nowa linia na windowsie (więc w notepad.exe) to \r\n a nie samo \n. Samo \n to tzw newline linuxowy, a samo \r to newline MacOS.
To takie troche antyczne zaszłości z czasów DOSowych terminali. \n to znak nowej linii, a \r to carrige-return czyli powrót karetki maszynopisu na początek linii...

0

ok ... czyli 10 i 13 w int.

0

Dwie rzeczy, po pierwsze \r jest nie tylko używany do oznaczania końca linii ale również do cofania karetki na początek linii w terminalu.
Przydaje się to czasem do robienia pasków postępu w konsoli, na przykład (na Linuxie):

$ echo -e 'kurwa-mac\rCENZURA'
CENZURAac

(-e oznacza że echo traktuje \r nie jako tekst ale jako escape sequence)

Wbudowany w IJ terminal ma problemy z \r jak napiszesz na przykład

		System.out.print("XXXkurwa-macXXX\rCENZURA\n");
		System.out.println();

to się wypisze jedynie CENZURA.

Druga sprawa jest taka że jak wstawiasz [ENTER] pomiędzy \r i \n to tak naprawdę psujesz znak końca linii.
Oba te znaki muszą na Windzie występować jeden po drugim.

Na zakończenie pasek postępu wyrzeźbiony od ręki (więc nie piękny):

for i in $(seq 1 10); do seq 1 $i | tr -d '\n' | tr '[0-9]' '='; echo -ne '\r'; sleep 1; done

Odpalać w wind sussys for Linux lub na prawdziwym Linuxie :D

0

Dziękuję za wniesienie wkładu do moich przemyśleń ...

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