文件处理错误

时间:2013-03-19 14:34:52

标签: c# file-handling

我目前正在尝试使用Stream Writer和Stream Reader将数据输入到文本文件中以输出信息,在本例中为First Name,Surname&年龄。然后我想将这些信息输出到下面列出的表中:

First Name          Surname              Age
Etc                 Etc                  Etc
然而,我在解决问题时遇到了一些问题!!

请参阅下面的代码,任何人都可以解释为什么我收到以下错误消息?

  

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

     

错误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 个答案:

答案 0 :(得分:2)

首先将String变量设置为默认值:

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

然后,如果你的for循环没有执行,你的变量将有一个初始值。稍后在代码中访问时,将不会发生错误

在评论中添加编辑,初始化计数器:

int Counter=0;

答案 1 :(得分:1)

在C#中,错误Use of unassigned local variable表示您正在尝试使用尚未给出值的变量。与其他语言不同,C#要求您保证在使用变量之前已经为变量赋予了某些东西(甚至是null) - 它不会将变量初始化为默认值(如VB.NET)或者将它们保留为垃圾值(比如C ++)。

在您的情况下,firstname填充在for循环内部,这意味着如果for循环的主体永远不会执行,它可能永远不会得到值。当您尝试在do中使用它时,它可能从未被分配过。

要解决此问题,最常见的方法是在声明变量时将其设置为null,这意味着您可以保证在使用变量时它会有一些东西。当然,如果变量一直保持为空,请确保正确处理会发生的情况。

答案 2 :(得分:0)

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

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

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

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

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

答案 3 :(得分:0)

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

string firstname = string.empty; // And so on..