我目前正在尝试使用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
}
}
}
好的,所以你们有帮助的人让我超越错误!!谢谢:)
然而,(总有一个!!!) 我仍然无法让流编写器/阅读器在表格中显示结果。我将表格显示在结果之后,但表格是空白的,除了表格标题都在他们整洁的占位符中! 任何人..... :)):)):)
答案 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..