C# 为什么这个StreamReader只读一行?

C# 为什么这个StreamReader只读一行?,c#,streamreader,C#,Streamreader,下面的代码应该读取文件的每一行并对其进行操作。但是,它只读取第一行。如果没有for循环,它将读取整个文件。我真的不知道为什么它不读整件事 StreamReader sr = new StreamReader(gridPath); string line; char[] lineCh; char current; int x, y; bool north, east, south, west; x = y = 0; while ((line = sr.ReadLine()) != null)

下面的代码应该读取文件的每一行并对其进行操作。但是,它只读取第一行。如果没有for循环,它将读取整个文件。我真的不知道为什么它不读整件事

StreamReader sr = new StreamReader(gridPath);

string line;
char[] lineCh;
char current;
int x, y;
bool north, east, south, west;

x = y = 0;

while ((line = sr.ReadLine()) != null)
{
    lineCh = line.ToCharArray();
    for (int i = 0; i < lineCh.Length; i++)
    {
        current = lineCh[i];
        north = CheckInput(current);
        current = lineCh[++i];
        east = CheckInput(current);
        current = lineCh[++i];
        south = CheckInput(current);
        current = lineCh[++i];
        west = CheckInput(current);
        i++; // Hop over space
        grid[x, y] = new GridSquare(north, east, south, west);
        x++; // Start next column
    }
    Console.WriteLine(line);
    y++;
}
检查输入如下:

private bool CheckInput(char c)
{
    switch (c)
    {
        case 'y':
            return true;
        case 'n':
            return false;
        default:
            return true;
    }
}
示例输入文件:

nyyn nyyy nyyy nyyy nyyy nnyy
yyyn yyyy yyyy yyyy yyyy ynny
yyyn yyyy yyyy yyyy ynyy nnnn
yyyn yyyy yyyy yyyy ynyy nnnn
yyyn yyyy yyyy yyyy yyyy nnyy
yynn yyny yyny yyny yyny ynny

我想你的问题可能是

for (int i = 0; i < lineCh.Length; i++)
for(int i=0;i
结合了许多++i语句

下面是带有大量注释的代码。。。假设每行为“1234”

StreamReader sr=新的StreamReader(gridPath);
弦线;
char[]lineCh;
炭流;
int x,y;
布尔北、东、南、西;
x=y=0;
而((line=sr.ReadLine())!=null)
//行是“yyy”
{
lineCh=line.ToCharArray();
//线条长度为4
对于(int i=0;i
您是否在for循环中遇到异常?您正在增加i,可能在某个时候您试图错误地索引
lineCh


编辑:另一个索引错误的候选对象是
网格
数组。我没有看到初始化代码,
x
y
的值是在读取文件后确定的。如何初始化它?

您的代码抛出异常,因为您可以在这些行中的任何一行获得数组边界:

current = lineCh[++i];

您正在修改循环体中的循环控制变量,这是应该避免的,因为它会导致循环的意外执行

请展示您正在尝试处理的行的一个示例,我可能能够建议更好地实现for循环

您需要一次处理整行还是需要将其分成4个字符的块,处理这4个字符,然后移到下一行

您可以尝试更改处理该行的方式:

        while ((line = sr.ReadLine()) != null)
        {
            string[] segments = line.Split(' ');

            foreach(string segment in segments)
            {
                char[] arr = segment.ToCharArray();
                north = CheckInput(arr[0]);
                east = CheckInput(arr[1]);
                west = CheckInput(arr[2]);
                south = CheckInput(arr[3]);
                grid[x, y] = new GridSquare(north, east, south, west);
            }


            Console.WriteLine(line);
            y++;
        }
在这里,我根据空格分割行,然后通过将行分割成字符数组并访问特定字符,对单个段进行操作


此代码还假设每个段始终有4个字符,是否始终如此?您还应添加验证以确保行符合预期。

在循环本身内增加循环变量是危险的。我建议为您的north、east等创建自定义类型。变量,然后使用每一行直到结束。或者最好返回下一个GridSquare对象

这可以通过返回GridSquares迭代器的方法完成:

StreamReader sr = new StreamReader("input.txt");

string line;
char[] lineCh;
char current;
int x, y;
bool north, east, south, west;

x = y = 0;

while ((line = sr.ReadLine()) != null)
{
    foreach (var gs in GetGridSquares(line))
    {
        // grid[x, y] = gs;
    }

     Console.WriteLine(line);
     y++;
 }
GetGridSquares是:

 private IEnumerable<GridSquare> GetGridSquares(string line)
    {
        var splittedLine = line.Split(' ');
        foreach (var gsStr in splittedLine)
        {
            if (gsStr.Length != 4)
            {
                continue;
            }

            yield return new GridSquare(gsStr[0], gsStr[1], gsStr[2], gsStr[3]);
        }
    }
private IEnumerable GetGridSquares(字符串行)
{
var splittedLine=行分割(“”);
foreach(拆分行中的var gsStr)
{
如果(gsStr.Length!=4)
{
继续;
}
收益率返回新GridSquare(gsStr[0],gsStr[1],gsStr[2],gsStr[3]);
}
}
StreamReader sr=新的StreamReader(gridPath);
var线;
var y=0;
而((line=sr.ReadLine())!=null)
{

对于(var i=0;i我在清理代码后发现的实际答案是x从未被设置回零;我们从未移动到网格的下一行[,]。我意识到这很难从我的示例中解决,我在这里表示歉意。

作为补充,您不需要将字符串转换为字符数组,字符串上有一个索引器,您可以直接使用,可能是因为文件只包含一行?@tsv:您可以向我们展示读取整个文件的代码吗?检查输入的确切内容是什么函数?是否在调用堆栈上方捕获异常?@tsv:假设Visual Studio:转到调试->异常,在公共语言运行时异常旁边,单击“抛出”下的复选框。单击“确定”,然后在调试器中运行代码。与此问题无关,但您应该将using语句与
StreamReader
为确保其正确处理,为什么会出现问题?++i与字符数组的结尾不同。一行中大概有1个以上的网格。它只需要与我的“官方”一起使用输入,我现在给出的一个示例在循环开始时不会再次递增吗?下一个循环将以I==5开始,其中应为4。对我来说,这似乎是一个巨大的反模式。数据应序列化以便可读。代码高度依赖于数据格式,单个字符可能导致异常打开。循环中没有异常。它读取一整行数据很好;当然它应该重置自身,并读取其他数据也很好?@tsv:您是如何检查并得出结论的,循环没有抛出异常,并且不是其他地方捕获它的?@Mehrdad如果您使用示例输入对循环进行计数,您应该会发现没有错误打开以引发异常。@tsv:到目前为止,您已经查看了源代码,但看不到它不起作用的原因。您只是猜测它不会引发异常,就像您有spe一样
StreamReader sr = new StreamReader("input.txt");

string line;
char[] lineCh;
char current;
int x, y;
bool north, east, south, west;

x = y = 0;

while ((line = sr.ReadLine()) != null)
{
    foreach (var gs in GetGridSquares(line))
    {
        // grid[x, y] = gs;
    }

     Console.WriteLine(line);
     y++;
 }
 private IEnumerable<GridSquare> GetGridSquares(string line)
    {
        var splittedLine = line.Split(' ');
        foreach (var gsStr in splittedLine)
        {
            if (gsStr.Length != 4)
            {
                continue;
            }

            yield return new GridSquare(gsStr[0], gsStr[1], gsStr[2], gsStr[3]);
        }
    }
StreamReader sr = new StreamReader(gridPath);

var line;       
var y = 0;  

while ((line = sr.ReadLine()) != null)
{
    for(var i =0; i<line.length;i+=2)
    {
        grid[i,y]=new GridSquare(GetBits(line[i],i));
        grid[i+1,y]=new GridSquare(GetBits(line[i],i+1));


    }
    ++y;

}

bool [] GetBits(char bBytes, int n)
{
    var returned = new bool[4];
    bBytes = bBytes << ((n%2)*4);
    for(var i =0; i < 4; ++i)
        returned[i]=(bBytes & (1<<i ) > 0;

}