0

私は Java の学習を開始しましたが、コンテンツをnumbers.datファイルに書き込む単純なプログラムに問題があります。

私は2つの問題に直面しています:

  1. 私が得ている出力は次のとおりです。

    2、6、12、20、30、42、56、72、90、110、132、156、182、210、240、272、306、342、380、420、462、506、552、600、650、 702、756、812、870、930、992、1056、1122、1190、1260、1332、1406、1482、1560、1640、1722、1806、1892、1980、2070、2162、250、2525。 ..

    それがいつあるべきか:

    偶数の場合:

    2,4,6,8,10,12,14,……,98,100

    奇数の場合:

    2,4,6,8,10,12,14,……,98,100,1,3,5,7,9,……..97,99

  2. 私の 2 番目の問題は、出力がnumbers.datファイルに書き込まれていないことです。それはすべて空白です。

私が解決しようとしている本の質問は次のとおりです。

Numbers.dat という名前のファイルを作成する TextFileIO.java というプログラムを作成します。次に、1 から 100 までのすべての偶数の整数をコンマで区切って書き込むアルゴリズムを作成します。

ファイルが作成されたら、ファイルを閉じてから再度開き、結果を画面に表示します。結果が表示されたら、1 から 100 までの奇数の整数をコンマで区切ってファイルの末尾に追加します。ファイルを再度開き、結果を表示します。ファイルの内容は、カンマで区切られた 1 ~ 100 の偶数と、カンマで区切られた 1 ~ 100 の奇数が続く必要があります。このプログラムの出力は、次のようになります。

2,4,6,8,10,12,14,……,98,100

2,4,6,8,10,12,14,……,98,100,1,3,5,7,9,……..97,99

以下は、これまでに試したコードです。

textFileIO.java

package package1;

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

//class definition
public class textFileIO{

    //The main function
    public static void main(String args[]) {

        //This declares a file to open.
        File outFile = new File("numbers.dat");

        int sumEven = 0;
        int sumOdd = 0;

        //File IO requires a try/catch block to prevent the program from crashing
        try {

            //a buffered writer is used to allow us to write to the file.
            BufferedWriter writer = new BufferedWriter(new FileWriter(outFile));

            //This for loop handles adding all of the numbers together
            for(int i = 1; i < 100; i += 2) {
                sumEven += i + 1;
                writer.write("" + sumEven + ", ");
            }

            //adding a new line and closing the file
            writer.newLine();
            writer.close();

            //A buffered Reader is used for reading a new file.
            BufferedReader reader = new BufferedReader(new FileReader(outFile));

            //Because I only add a new line at the end, I only need to read the first line.
            System.out.println(reader.readLine());

            //I need to write again, so I close the reader and open the writer.
            reader.close();

            //you need to create another object to append to the file
            //writer.open();
            BufferedWriter writer2 = new BufferedWriter(new FileWriter(outFile));

            //This for loop is identical to the previous one, except for odd numbers
            for(int i = 1; i < 100; i += 2) {
                sumOdd += i;
                writer2.write("" + sumOdd + ", ");
            }

            writer.newLine();
            writer.close();

            //The same here. You need to create another reader
            //reader.open();
            BufferedReader reader2 = new BufferedReader(new FileReader(outFile));
            System.out.println(reader2.readLine());

        }
        catch (Exception e) {

        }
    }
}

編集 2

コードを変更しました。これが最新のコードです。私はまだ問題を抱えています。コンソールの出力画面に出力として 49 と 50 が表示され、numbers.dat ファイルにカンマ区切りの奇数のリストのみが表示されるようになりました。私は今何を間違っていますか?

import java.io.*;
    import java.util.*;
    public class TextFileIO {
        public static void main(String[] args) throws Exception {
            //Clear the contents of numbers.dat if already exists and populated
            File fileOne = new File("numbers.dat");
            fileOne.delete();
            File newFile = new File("numbers.dat");
            newFile.createNewFile();
            //Create writer object
            PrintWriter writer = new PrintWriter(new FileWriter("numbers.dat"));
            //Loop from 1 to 100
            for (int i = 1; i <= 100; i++) {
                //If number is even, write to file  
                if (i % 2 == 0) {
                    writer.print(i + ",");
                }
            }
            //Close writer object.
            writer.close();
            //Read from file
            FileInputStream fileStream = new FileInputStream("numbers.dat");
            DataInputStream in = new DataInputStream(fileStream);
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            //Print line
            System.out.println(reader.read());
            reader.close();
            //Write all odd numbers to file
            PrintWriter writer2 = new PrintWriter(new FileWriter("numbers.dat"));
            //Loop from 1 to 100
            for (int i = 1; i <= 100; i++) {
                //If number is odd, write to file  
                if (i % 2 == 1) {
                    writer2.print(i + ",");
                }
            }
            writer2.close();
            //Read from file
            FileInputStream fileStream2 = new FileInputStream("numbers.dat");
            DataInputStream in2 = new DataInputStream(fileStream2);
            BufferedReader reader2 = new BufferedReader(new InputStreamReader(in2));
            //Print line
            System.out.println(reader2.read());
            reader.close();
        }
     
     
    }

編集 3:目的の出力をまだ取得できません。私はまだコンソールで 49 と 50 として出力を取得しています。numbers.dat ファイルでは、出力はコンマで区切られた奇数のみです。コードで何を変更すればよいのか正確に理解できません。

4

4 に答える 4

2

正しい番号を印刷するには、変更する必要があります

偶数ループ:

//This for loop handles adding all of the numbers together
for(int i = 2; i <=100; i += 2) {
writer.write("" + i + ", ");
}

奇数ループ:

//This for loop is identical to the previous one, except for odd numbers
for(int i = 1; i < 100; i += 2) {
writer2.write("" + i + ", ");
}

そして、次のステートメントを置き換えます。

System.out.println(reader.read());

System.out.println(reader.readLine());

これで完了です。

編集

public class textFileIO {
    public static void main(String[] args) throws Exception {
        //Clear the contents of numbers.dat if already exists and populated
        File fileOne = new File("numbers.dat");
        fileOne.delete();
        File newFile = new File("numbers.dat");
        newFile.createNewFile();
        //Create writer object
        PrintWriter writer = new PrintWriter(new FileWriter("numbers.dat"));
        //Loop from 1 to 100
        for (int i = 1; i <= 100; i++) {
            //If number is even, write to file  
            if (i % 2 == 0) {
                writer.print(i + ",");
            }
        }
        //Close writer object.
        writer.close();
        //Read from file
        FileInputStream fileStream = new FileInputStream("numbers.dat");
        DataInputStream in = new DataInputStream(fileStream);
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        //Print line
        System.out.println(reader.readLine());
        reader.close();
        //Write all odd numbers to file
        PrintWriter writer2 = new PrintWriter(new FileWriter("numbers.dat"));
        //Loop from 1 to 100
        for (int i = 1; i <= 100; i++) {
            //If number is odd, write to file  
            if (i % 2 == 1) {
                writer2.print(i + ",");
            }
        }
        writer2.close();
        //Read from file
        FileInputStream fileStream2 = new FileInputStream("numbers.dat");
        DataInputStream in2 = new DataInputStream(fileStream2);
        BufferedReader reader2 = new BufferedReader(new InputStreamReader(in2));
        //Print line
        System.out.println(reader2.readLine());
        reader.close();
    }
}

これは私にとって完璧に機能し、ここに出力があります...

2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50, 52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,1, 3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51, 53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99,

于 2012-08-11T12:02:52.983 に答える
1

いくつかのこと:

  1. 2 番目のライター (writer2) の場合、FileWriter コンストラクターで「true」値を渡す必要があります。それ以外の場合は、outfile を新しいコンテンツで上書きするだけです ( FileWriter コンストラクターを参照) 。

    PrintWriter writer2 = new PrintWriter(new FileWriter("numbers.dat" , true ));

  2. Govan が述べたように、あなたは writer2 を閉じていません。これが、ファイルが空白である理由です。writer2.close を呼び出すと、BufferedWriter の「フラッシュ」メソッドが呼び出されます。「フラッシュ」は、実際にライターにファイルへのデータの書き込みを強制するものです ( BufferedWriter をフラッシュする場合)。

  3. Bharat が述べたように、sumEven ではなく、"i" 変数を使用して書き込むようにループを書き直す必要があります。sumEven を書くと、次のようになります。

    i=1、合計偶数 = 合計偶数 + i + 1 = 0 + 1 + 1 = 2

    i=3、合計偶数 = 合計偶数 + i + 1 = 2 + 3 + 1 = 6

    i=5、合計偶数 = 合計偶数 + i + 1 = 6 + 5 + 1 = 12

    ...

于 2012-08-11T13:00:47.157 に答える
1

最初のループは次のようになります

for (i = 0; i < 100 ; i+2)
{ 
   if (i != 0) {
    writer.print(", ");
   } 
    writer.print(i+2);
}   

2番目はこのようになります

for (i = 0; i < 100 ; i+2)
{ 
    writer.print( ", " +(i+1));
}   

それ以外の場合は、行末に余分なコンマを追加する必要があります!

于 2012-08-11T13:14:58.237 に答える
1

コードにいくつかの変更を加えました。

まず、2 つのライターは必要ありません。また、2 つのリーダーも必要ありません。

1 つのファイルにしか書き込みを行っていないため、1 つのライターで偶数と奇数の両方を書き込むことができます。2 つのライターを検討するシナリオは、奇数ファイルと偶数ファイルを別々に同時に書き込んでいる場合です。

とにかく、私は綿毛のものをコメントアウトしました。すべてのコメントを削除すると、コードはよりシンプルになり、機能し、特に読みやすくなります。

import java.io.*;
    import java.util.*;
    public class TextFileIO {
        public static void main(String[] args) throws Exception {
            //Clear the contents of numbers.dat if already exists and populated
            File fileOne = new File("numbers.dat");
            fileOne.delete();
            File newFile = new File("numbers.dat");
            newFile.createNewFile();
            //Create writer object
            PrintWriter writer = new PrintWriter(new FileWriter("numbers.dat"));
            //Loop from 1 to 100
            for (int i = 1; i <= 100; i++) {
                //If number is even, write to file  
                if (i % 2 == 0) {
                    writer.print(i + ",");
                }
            }
            //Close writer object.
            //writer.close();
            //Read from file
            //FileInputStream fileStream = new FileInputStream("numbers.dat");
            //DataInputStream in = new DataInputStream(fileStream);
            //BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            //Print line
            //System.out.println(reader.readLine());
            //reader.close();
            //Write all odd numbers to file
            //PrintWriter writer2 = new PrintWriter(new FileWriter("numbers.dat"));
            //Loop from 1 to 100
            for (int i = 1; i <= 100; i++) {
                //If number is odd, write to file  
                if (i % 2 == 1) {
                    writer.print(i + ",");
                }
            }
            writer.close();
            //Read from file
            FileInputStream fileStream2 = new FileInputStream("numbers.dat");
            DataInputStream in2 = new DataInputStream(fileStream2);
            BufferedReader reader2 = new BufferedReader(new InputStreamReader(in2));
            //Print line
            System.out.println(reader2.readLine());
            reader2.close();
        }


    }

コードを少しクリーンアップすると、以下が得られます

import java.io.*;
import java.util.*;
public class TextFileIO {
    public static void main(String[] args) throws Exception {
        //Clear the contents of numbers.dat if already exists and populated
        File fileOne = new File("numbers.dat");
        fileOne.delete();
        File newFile = new File("numbers.dat");
        newFile.createNewFile();
        //Create writer object
        PrintWriter writer = new PrintWriter(new FileWriter("numbers.dat"));
        //Loop from 1 to 100
        for (int i = 1; i <= 100; i++) {
            //If number is even, write to file  
            if (i % 2 == 0) {
                writer.print(i + ",");
            }
        }
        //Loop from 1 to 100
        for (int i = 1; i <= 100; i++) {
            //If number is odd, write to file  
            if (i % 2 == 1) {
                writer.print(i + ",");
            }
        }
        writer.close();
        //Read from file
        FileInputStream fileStream = new FileInputStream("numbers.dat");
        DataInputStream in = new DataInputStream(fileStream);
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        //Print line
        System.out.println(reader.readLine());
        reader.close();
    }
}
于 2012-08-11T21:26:49.997 に答える