-1

現在、StreamWriterとStreamReaderを使用してテキストファイルにデータを入力し、情報(この場合は名、名前、年齢)を出力しようとしています。次に、これを以下の表に出力したい情報を使用します。

First Name          Surname              Age
Etc                 Etc                  Etc

しかし、私はそれを解決するのにいくつかの問題があります!!

以下の私のコードを参照してください。次のエラーメッセージが表示される理由を誰かが説明できますか?

エラー1割り当てられていないローカル変数「名」の使用

エラー2割り当てられていないローカル変数「lastname」の使用

エラー3割り当てられていないローカル変数「age」の使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO; 

namespace ConsoleApplication1
{// Start namespace
    class Program
    {// Start Class
        static void Main(string[] args)
        {// Start Main
            // Declaration Strings

            String firstname; // Declares Name as a String
            String lastname; // Declares Surname as a String
            String age; // Declares Age as a String
            int Counter; // Declares Counter as an Integer

            FileInfo fleNames = new FileInfo("Names.txt"); // Creates fleNames as an Object, using Names.txt as the file name
            StreamWriter swrNames = fleNames.CreateText(); // Informs fleName to Create Text

            for (Counter = 0; Counter < 1; Counter++)
            {
                Console.Write("Enter Your First Name:"); // Writes users first name using Stream Writer Command
                firstname = Console.ReadLine(); 
                swrNames.WriteLine(firstname); // This dictates where the first name will be stored in the text file
                swrNames.Flush();

                Console.Write("Enter Your Surname"); // Writes users first name using Stream Writer Command
                lastname = Console.ReadLine();
                swrNames.WriteLine(lastname); // This dictates where the last name will be stored in the text file
                swrNames.Flush();


                Console.WriteLine("Enter Your Age"); // Writes users first name using Stream Writer Command
                age = Console.ReadLine();
                swrNames.WriteLine(age); // This dictates where the age will be stored in the text file
                swrNames.Flush();
                Console.Clear();


            }


            swrNames.Close();

            String NamesTable;

            StreamReader swreNames = File.OpenText("Names.txt");

            while ((NamesTable = swreNames.ReadLine()) != null)
            {
                Console.WriteLine(NamesTable);

            }

            swreNames.Close();

            Console.ReadLine();

            FileInfo fleNamesTwo = new FileInfo("NamesTwo.txt");

            StreamWriter swrNamesTwo = null;


            // ------------ CHECK APPEND TO A FILE --------------

            if (fleNames.Exists == true)
            {
                swrNames = fleNames.AppendText();
            }
            else // -- Create a new text file 
            { // Declare Strings
                String Name; // Name
                String Surnames; // Surname
                String Ages; // Age
                swrNamesTwo = fleNamesTwo.CreateText();

                Console.Write("Enter Your First Name");
                Name = Console.ReadLine();
                swrNamesTwo.WriteLine(Name);
                swrNamesTwo.Flush();

                Console.Write("Enter Your Surname");
                Surnames = Console.ReadLine();
                swrNamesTwo.WriteLine(Surnames);
                swrNamesTwo.Flush();


                Console.WriteLine("Enter Your Age");
                Ages = Console.ReadLine();
                swrNamesTwo.WriteLine(Ages);
                swrNamesTwo.Flush();
                Console.Clear();


            }

            Console.Clear();


            Console.SetCursorPosition(15, 2);

            Console.Write("--- Names Table ---");

            Console.SetCursorPosition(10, 4);

            Console.Write("First Name");

            Console.SetCursorPosition(28, 4);

            Console.Write("Surname");

            Console.SetCursorPosition(48, 4);

            Console.Write("Age");

            Console.ReadLine();

            do  
            {
                //Read a File a Streamreader Command

                swrNames.WriteLine(firstname); // Reads from first name from file Names.txt
                Console.SetCursorPosition(10, Counter + 6); // Aligns first name within table settings 

                swrNames.WriteLine(lastname); // Reads from last name from file Names.txt
                Console.SetCursorPosition(28, Counter + 6); 

                swrNames.WriteLine(age); // Reads from age from file Names.txt
                Console.SetCursorPosition(48, Counter + 6);
                Console.WriteLine("{0} {1} is {2} years old", firstname, lastname, age);


                Console.Clear();  //Clears Screen
                Console.ReadLine();



            } while ((firstname = swreNames.ReadLine()) != null); //Writes out the input from the text file
        }
    }
}

わかりました、あなたは親切な人々が私をエラーを乗り越えさせてくれました!! ありがとうございました :)

ただし、(常にあります!!!)ストリームライター/リーダーに結果をテーブルに表示させることはできません。結果の後にテーブルが表示されますが、テーブルの見出しがすべて適切なプレースホルダーにあることを除いて、テーブルは空白です。誰でも..... :):):)

4

4 に答える 4

2

String 変数をデフォルト値に設定することから始めます。

        String firstname = string.empty;
        String lastname = string.empty; 
        String age = string.empty; 

次に、for ループが実行されない場合、変数の値は初期化されます。コードで後でアクセスすると、エラーは発生しません

コメントごとに編集を追加し、カウンターを初期化します。

int Counter=0;
于 2013-03-19T14:42:08.430 に答える
1

C# では、このエラーUse of unassigned local variableは、まだ値を指定していない変数を使用しようとしていることを意味します。C# は、他の一部の言語とは異なり、変数を使用する前に変数に何か (null であっても) を割り当てたことを保証する必要があります。変数を既定値 (VB.NET など) に初期化したり、ガベージ値のままにしたりしません。 (C++ のように)。

あなたの場合、ループfirstname内で満たされていforます。つまり、ループの本体がfor実行されない場合、値が取得されない可能性があります。内で使用しようとすると、do割り当てられていない可能性があります。

これを解決するための最も一般的な方法はnull、変数を宣言するときに に設定することです。これは、変数を使用するときに何かがあることを保証したことを意味します。もちろん、変数が最後まで null のままである場合に何が起こるかを適切に処理するようにしてください。

于 2013-03-19T14:40:11.257 に答える
0

コンパイラは、このループを認識できるほど賢くありません。

for (Counter = 0; Counter < 1; Counter++)

常に 1 回だけ実行されます。そのため、コードがまったく実行されない可能性があると想定する必要があります。その場合、これらの変数は決して初期化されません。

forループが本当に一度だけ実行されることを意図している場合は、forループを削除するだけで、変数が使用される前に値が割り当てられます。

カウンターがテスト用であり、ループを複数回実行する場合はfor、変数をダミーの開始値 ( 、 など) に初期化しnullます""

于 2013-03-19T14:43:03.543 に答える
0

コードをクリーンアップしてみてください (ユーザー入力の前に for ループは必要ありません。一度だけ実行されます)。コードを少し変更して、Console.ReadLine()返されるものを検査できるようにします。また、変数がどこかで使用されているため、エラーが発生しているように見えますが、割り当てられていない可能性があります (for look 条件が満たされていない場合)。それらを宣言するときに値を指定すると、エラーが消えるはずです。ところで、コードをリファクタリングし、メインを 1 つ以上のメソッドに分割することを検討してください。

string firstname = string.empty; // And so on..
于 2013-03-19T14:44:51.353 に答える