-1

我目前正在尝试使用 Stream Writer 和 Stream Reader 将数据输入文本文件以输出信息,在本例中为 - 名字、姓氏和年龄。然后使用我希望将其输出到下表中的信息:

First Name          Surname              Age
Etc                 Etc                  Etc

但是我在解决它时遇到了一些问题!

请在下面查看我的代码,谁能解释为什么我收到以下错误消息?

错误 1 ​​使用未分配的局部变量 'firstname'

错误 2 使用未分配的局部变量“姓氏”

错误 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在声明变量时设置它,这意味着你已经保证了当你去使用它时它会有一些东西。当然,请确保您正确处理如果变量一直保持为空会发生的情况。

于 2013-03-19T14:40:11.257 回答
0

编译器不够聪明,无法知道这个循环:

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

将始终只执行一次。所以它必须假设代码有可能根本不会执行,在这种情况下,这些变量永远不会被初始化。

如果您的for循环真的只打算执行一次,只需删除for循环,变量将在使用之前被分配一个值。

如果计数器仅用于测试并且您打算for多次执行循环,则将变量初始化为一些虚拟起始值(null,""等)

于 2013-03-19T14:43:03.543 回答
0

尝试清理您的代码(在用户输入之前您不需要 for 循环,无论如何它只会执行一次)。稍微更改您的代码,以便您可以检查Console.ReadLine()返回的内容。此外,错误似乎正在发生,因为变量在某处使用但它们可能未分配(如果不满足 for 查找条件)。在声明它们时给它们一个值,错误应该会消失。顺便说一句,考虑重构您的代码并将主要内容拆分为一种或多种方法。

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