🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1019閲覧

エンターキーでの処理

kwkw7575

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/10/31 02:06

編集2019/10/31 02:43

ファイルの読み書きの問題を解いています。
・指定のファイルから表を読み込み、以降エンターキーを押すたびにs[i]の文字列を表示させs[12]が表示されたとき指定のファイルに書き込みするプログラムです。

・こちらのコードで実行したら エンターキー2回目に押したとき(NULL と s[2])が表示され、それ以降 s[i]の文字列が2つずつ表示されてしまいます。

・NULLを無くし、s[12]の文字列を1つずつ表示したいのですが何が原因でしょうか?

※NULLの謎は 回答者様のおかげで無事解けました。ありがとうございました。

import java.io.*; class mazedat{ public static void main(String args[]){ File file = new File("maze.dat"); if(!file.exists()){ System.out.print("null"); } try{ FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader); String data; while((data = bufferedReader.readLine())!=null){ System.out.println(data); } String s[]= new String[13]; s[1]="*s******\n*. * *\n* * ** *\n* * * *\n* * **\n*** * **\n* * *\n******e*"; s[2]="*s******\n* . * *\n*.* ** *\n* * * *\n* * **\n*** * **\n* * *\n******e*"; s[3]="*s******\n* . * *\n* * ** *\n*.* * *\n* * **\n*** * **\n* * *\n******e*"; s[4]="*s******\n* * *\n* *.** *\n* * * *\n*.* **\n*** * **\n* * *\n******e*"; s[5]="*s******\n* * *\n* * ** *\n* *.* *\n* * **\n*** * **\n* * *\n******e*"; s[6]="*s******\n* * *\n* * ** *\n* * * *\n* *. **\n*** * **\n* * *\n******e*"; s[7]="*s******\n* * *\n* * ** *\n* * * *\n* * . **\n***.* **\n* * *\n******e*"; s[8]="*s******\n* * *\n* * ** *\n* * * *\n* * .**\n*** * **\n* .* *\n******e*"; s[9]="*s******\n* * *\n* * ** *\n* * * *\n* * **\n*** *.**\n* . * *\n******e*"; s[10]="*s******\n* * *\n* * ** *\n* * * *\n* * **\n*** * **\n*. *. *\n******e*"; s[11]="*s******\n* * *\n* * ** *\n* * * *\n* * **\n*** * **\n* * .*\n******e*"; s[12]="*s******\n*... * *\n*.*.** *\n*.*.* *\n*.*...**\n***.*.**\n*...*..*\n******e*"; for(int i = 0; i < s.length; i++){ System.in.read(); System.out.println(s[i]); } File file2 = new File("maze_result.dat"); FileWriter filewriter = new FileWriter(file2); filewriter.write(s[12]); filewriter.close(); bufferedReader.close(); }catch(Exception e){ e.printStackTrace(); } } }

このように処理されます。

C:\practice>java mazedat *s****** * * * * * ** * * * * * * * ** *** * ** * * * ******e* null *s****** *. * * * * ** * * * * * * * ** *** * ** * * * ******e* *s****** * . * * *.* ** * * * * * * * ** *** * ** * * * ******e* *s****** * . * * * * ** * *.* * * * * ** *** * ** * * * ******e* *s****** * * * * *.** * * * * * *.* ** *** * ** * * * ******e* *s****** * * * * * ** * * *.* * * * ** *** * ** * * * ******e* 以降2つずつ表示されます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dice142

2019/10/31 03:20

解決できたのならベストアンサーを選んで解決済みにしてください。
kwkw7575

2019/10/31 03:31

s[i]の文字列を1つずつ表示できない原因がわかっていなかったので、、。
dice142

2019/10/31 03:39

質問文に書いてましたね。 すみません、見逃してました。
kwkw7575

2019/10/31 03:47

こちらこそ せっかく回答して頂いたのに ベストアンサーにできず申し訳ありません。
guest

回答2

0

ベストアンサー

String s[]= new String[13]; s[1]="*s******\n*. * *\n* * ** *\n* * * *\n* * **\n*** * **\n* * *\n******e*"; s[2]="*s******\n* . * *\n*.* ** *\n* * * *\n* * **\n*** * **\n* * *\n******e*"; s[3]="*s******\n* . * *\n* * ** *\n*.* * *\n* * **\n*** * **\n* * *\n******e*";

に対し、

for(int i = 0; i < s.length; i++){ System.in.read(); System.out.println(s[i]); }

と、s[0]から表示を行っているので、
s[0]に何も代入されておらず、nullが表示されます。


s[12]の文字列を1つずつ表示したい

おそらくWindowsでの実行でしょうか。
System.in.read()でエンターキーを押すと、Windowsでは2文字分読み取ります。
1回のSystem.in.read()で文字1個を読み取るため、余った分は次のループで読み取ります。

System.in.skip()を使うか、readLine等で1行読み取るようにすると良いかと思います。

投稿2019/10/31 02:15

編集2019/10/31 03:48
dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kwkw7575

2019/10/31 02:19

回答ありがとうございます。 for(int i = 0; i < s.length; i++){ の部分を for(int i = 1; i < s.length; i++){ にしたらNULLがなくなりました。
y_waiwai

2019/10/31 02:41

文字列の代入を s[0]からにしてもいいのでは
kwkw7575

2019/10/31 02:48

変わったやり方だと思われると思いますが、 1回目の時は "maze.dat"の表だけを表示させたかったために s[1]からに設定しましたm(_ _)m 他に方法があると思いますがわかなかったのが理由です。
kwkw7575

2019/10/31 02:54

y_waiwaiさんのおしゃる通りやってみたところ出来ました。 s[0]でもできるのですね。 勉強になります!ありがとうございました。
dice142

2019/10/31 03:18

> s[0]でもできるのですね。 むしろs[0]の分が無駄になるのでy_waiwaiさんの仰るようにs[0]から代入した方が良いかと思います。
dice142

2019/10/31 03:48

見落としていた分追記しました。
kwkw7575

2019/10/31 04:31

ありがとうございました。 無事、私がしたかったプログラムを作成できました。
guest

0

質問のプログラムで、nullが表示される可能性があるのは

File file = new File("maze.dat"); if(!file.exists()){ System.out.print("null"); }

の部分だけです。

そして、nullが表示されるのは、「!file.exists()」という条件("maze.dat"というファイルが無かった)が成り立つ場合です。

nullが表示されないようにするには、"maze.dat"ではなく、実際に存在するファイルのファイル名を使ってください。

投稿2019/10/31 02:32

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dice142

2019/10/31 02:37

nullのString型を出力してもnullと表示されますよ。
kwkw7575

2019/10/31 02:39

回答ありがとうございます。 実際になければ、「!file.exists()」という条件に満たす事を踏まえてファイルがあるかないかも再度確認し途方がいいということですね。勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問