我是C#中的结构新手而且我被卡住了,无法将文件中的值传递回struct并成功读取它们。
初始化值工作正常,但文件根本不会加载
这是我到目前为止所做的:
public struct Card
{
public char suit;//'C'- Clubs, 'D'-Diamonds,'H'- Hearts
//and 'S'- Spades
public int value;//2-14 – for 2-10, Jack, Queen, King, Ace
}
static void Main(string[] args)
{
const int CARDS_IN_HAND = 5;//number of cards in hand
Card[] hand = new Card[CARDS_IN_HAND];//array of cards
InitialiseArray(hand);
Console.WriteLine("-------------\n");
Console.WriteLine("Initialised Values in Array");
DisplayHandData(hand);
Console.ReadLine();
问题似乎在
之下 LoadArray(hand);//load values into array for use
//check values loaded to array
Console.WriteLine("-------------\n");
Console.WriteLine("Actuals Values in Array from file");
DisplayHandData(hand);
Console.ReadLine();
}
public static void InitialiseArray(Card[] data)
{
for (int count = 0; count < data.Length; count++)
{
data[count].suit = 'C';
data[count].value = 0;
}
}
public static void LoadArray(Card[] data)
{
string fileName = "FullHouse.txt";//name of file for menu item 3
//data in file = C 13 H 13 D 13 C 10 H 10
string input = fileName;
List<Card> cards = new List<Card>();
//string input = fileName;
StreamReader inFile = new StreamReader(fileName);//open file
input = inFile.ReadLine();//priming read for array
string[] inputArray = input.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);
//input loading data into array
for (int i = 0; i < 10; i += 2)
{
Card newCard = new Card();
newCard.suit = inputArray[i][0];
newCard.value = int.Parse(inputArray[i + 1]);
cards.Add(newCard);
}
inFile.Close();
}
public static void DisplayHandData(Card[] data)
{
Console.WriteLine();
//test values loaded into array in correct positions
for (int records = 0; records < data.Length; records++)
{
Console.WriteLine(data[records].suit);
Console.WriteLine(data[records].value);
}
Console.WriteLine("-------------\n");
Console.ReadLine();
}
非常感谢任何帮助。
答案 0 :(得分:1)
你的LoadArray
应该可以正常工作。问题可能是您填写变量cards
,这是一个本地List<Card>
,但您可能要做的是填写data
参数。
以下是我在for
方法中改变LoadArray
- 周期的习惯
for (int i = 0; i < data.Length; ++i)
{
Card newCard = new Card();
newCard.suit = inputArray[i * 2][0];
newCard.value = int.Parse(inputArray[i * 2 + 1]);
data[i] = newCard;
}
但请注意这种方法。它非常脆弱。如果data
和inputArray
的长度不匹配,您将获得异常(如果inputArray
将比预期的短)。您应该在for
- 周期之前检查长度。
答案 1 :(得分:1)
您的LoadArray()方法不会更改传入其中的数组的内容。
我建议您在main方法中使用List,然后将LoadArray()
更改为:
public static List<Card> LoadArray()
{
string fileName = "FullHouse.txt";//name of file for menu item 3
//data in file = C 13 H 13 D 13 C 10 H 10
string input = fileName;
List<Card> cards = new List<Card>();
//string input = fileName;
StreamReader inFile = new StreamReader(fileName);//open file
input = inFile.ReadLine();//priming read for array
string[] inputArray = input.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);
//input loading data into array
for (int i = 0; i < 10; i += 2)
{
Card newCard = new Card();
newCard.suit = inputArray[i][0];
newCard.value = int.Parse(inputArray[i + 1]);
cards.Add(newCard);
}
inFile.Close();
return cards;
}
那么你根本不需要InitialiseArray()
方法。
相反,你可以这样做:
var hand = LoadArray();
当然,您可能希望将LoadArray()
重命名为LoadHand()
。
答案 2 :(得分:0)
您可以使用Console.WriteLine(hand.Count)
检查该值,这会为您提供尺寸,您可以在hand
中显示您的数据
foreach(var h in hand)
{
Console.WriteLine(h.suit);
Console.WriteLine(h.value);
}
如果您愿意,也可以尝试一下。
hand.ForEach(h=>
{
Console.WriteLine(h.suit);
Console.WriteLine(h.value);
});
<强>被修改强>: 对不起,马修;我应该在你的回答中作为评论。 : - )