C# 流式读取文本文件

C# 流式读取文本文件,c#,C#,我有一段代码可以读取这个文本文件: 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1 1.1.1.2.2.2.2.1.1.1.2.2.1.1.1 1.2.2.2.2.2.2.2.2.2.2.2.2.1.1 1.1.2.2.2.2.2.2.2.2.2.2.2.1.1 1.1.2.2.2.2.2.2.2.2.2.2.1.1.1 1.1.1.1.2.2.2.2.2.2.2.2.1.1.1 1.1.1.1.2.2.2.2.2.2.1.1.1.1.1 1.1.1.1.1.1.2.2.2.1.1.

我有一段代码可以读取这个文本文件:

1.1.1.1.1.1.1.1.1.1.1.1.1.1.1
1.1.1.2.2.2.2.1.1.1.2.2.1.1.1
1.2.2.2.2.2.2.2.2.2.2.2.2.1.1
1.1.2.2.2.2.2.2.2.2.2.2.2.1.1
1.1.2.2.2.2.2.2.2.2.2.2.1.1.1
1.1.1.1.2.2.2.2.2.2.2.2.1.1.1
1.1.1.1.2.2.2.2.2.2.1.1.1.1.1
1.1.1.1.1.1.2.2.2.1.1.1.1.1.1
1.1.1.1.1.1.1.2.1.1.1.1.1.1.1
1.1.1.1.1.1.1.1.1.1.1.1.1.1.1
1.1.1.1.1.1.1.1.1.1.2.2.1.1.1
1.1.1.1.1.1.1.1.1.1.1.1.1.1.1
在某种程度上,一切都很顺利。我的目的是一个接一个地翻遍所有的角色,然后在翻完之后再换一行。这就是我的小问题发生的地方,我整晚都在努力解决这个问题

它很好地读了第一行,但没有读第二行

代码如下:

System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Text\TextFile.txt"); 

int loadX = 0;
int loadY = 0;
string line;

while (true)
{
    if (loadX <= 12)
    {
        loadX++;
        while ((line = file.ReadLine()) != null)
        {
            System.Threading.Thread.Sleep(500);
            string[] entries = line.Split('.');
            System.Console.Write(entries[loadX]);
            loadY++;
        }
    }

    System.Threading.Thread.Sleep(500);
    Console.Write($" Finished {loadX}");
    loadX = 0;
}
System.IO.StreamReader file=new System.IO.StreamReader(@“C:\Text\TextFile.txt”);
int loadX=0;
int-loadY=0;
弦线;
while(true)
{

如果(loadX您错误地认为它正在读取第一行。事实上,您当前的代码读取每行的第一个值。由于您的输入,这恰好是与第一行相似的输出,这导致了您的混淆

你的主循环应该循环通过每一行,然后你可以处理该行并循环通过每一个值。然后你可以随意使用它

以下是一个例子:

using(System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Text\TextFile.txt"))
{
    int loadX = 0;
    int loadY = 0;
    string line;

    // Loop through each line as you read it.
    while ((line = file.ReadLine()) != null)
    {
        // Split the line to get an array of values.
        string[] entries = line.Split('.');

        // Loop through each value and process.
        for(int i = 0; i < entries.length; i++)
        {
            string entry = entries[i];

            // TODO: Do something with entry.

            loadY++;
        }

        loadX++;
    }
}
使用(System.IO.StreamReader file=new System.IO.StreamReader(@“C:\Text\TextFile.txt”))
{
int loadX=0;
int-loadY=0;
弦线;
//读每一行的时候都要循环。
而((line=file.ReadLine())!=null)
{
//拆分该行以获得一个值数组。
string[]entries=line.Split('.');
//循环遍历每个值和过程。
for(int i=0;i
显然,在本例中未使用
loadX
loadY
,但这演示了如何正确地增加它们,以便您可以根据需要使用它们


提示:当使用
SteamReader
时,您应该确保正确处理它,最好使用
块将其包含在
中。

如果您想用X和Y遍历此文件中的每个数字,那么下面是一个示例:

string[] lines = File.ReadAllLines(@"C:\Text\TextFile.txt");

for(int indexY = 0; indexY < lines.Length; indexY++){
    string[] lineEntries = lines[indexY].Split('.');

    for(int indexX = 0; indexX < lineEntries; indexX++){
        // here you have one number by accessing
        // it with lineEntries[indexX]
        Console.Write(lineEntries[indexX]);
    }
    Console.WriteLine();
}
string[]lines=File.ReadAllLines(@“C:\Text\TextFile.txt”);
对于(int-indexY=0;indexY
如果你有更简单、更易读的方法来处理这个问题,那么使用while循环和StremReader似乎太愚蠢了

通过执行
File.ReadAllLines()

//行将是字符串数组
var lines=File.ReadAllLines(@“C:\Text\TextFile.txt”);
对于(int x=0;x

演示

while(真)
?为什么?这里有各种各样的错误它读取所有行,但只输出每行中的第一个数字…这可能就是为什么您认为它只执行一行为什么不直接将整个文件读取到字符串中,然后处理字符串?它的效率不高,但对于小文件来说,它不会像中那样影响每行的位置,我该怎么说呢…比如,我猜streamreader在哪里的某个位置。它在哪条线上,在这条线上的位置??比如X轴和Y轴。好吧,我会试试看,这看起来也更干净!我还想问Y从哪里来?它重吗?@MoonJaspers:对不起,打字错误。它应该是循环中的
I
。现在修复了干杯!我现在就试试。
//lines will be a string array
var lines = File.ReadAllLines(@"C:\Text\TextFile.txt");
for(int x = 0; x < lines .Length; x++)
{
    var cols = lines [x].Split('.');
    for(int y = 0; y < cols.Length; x++)
    {
        //Here you have access to the value, and the x and y position
        Console.WriteLine("x: {0}, y: {1} value: {2}", x, y, cols[y]);
    }   
}
var lines = File.ReadAllLines(@"C:\Text\TextFile.txt");
var points = lines.SelectMany((l, x) => l.Split('.').Select((s, y) => new {X = x, Y = y, Value = s}));
foreach (var point in points)
{
    Console.WriteLine($"({point.X}, {point.Y})={point.Value}");
}