Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中读取文件的特定行#_C#_Forms_Streamreader - Fatal编程技术网

C# 如何在C中读取文件的特定行#

C# 如何在C中读取文件的特定行#,c#,forms,streamreader,C#,Forms,Streamreader,我试图读取一个文件,但我需要控制文件中的行号。 我尝试使用StreamReader.ReadLine方法,但无法控制行号 这是我的代码: private void abrirToolStripMenuItem_Click(object sender, EventArgs e) { string line; if (openFileDialog1.ShowDialog() == DialogResult.OK) { S

我试图读取一个文件,但我需要控制文件中的行号。 我尝试使用StreamReader.ReadLine方法,但无法控制行号

这是我的代码:

private void abrirToolStripMenuItem_Click(object sender, EventArgs e)
    {
        string line;
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            StreamReader sr = new
            StreamReader(openFileDialog1.FileName);

            //Read specified line with StreamReader

            sr.Close();
        }

    }
这是一种形式,设计是西班牙语的


任何人都可以帮助我吗?

您可以使用
File.ReadLines()
返回
IEnumerable
。然后,您可以使用LINQ的
Skip()
FirstOrDefault()
方法跳过所需的行数,并获取第一项(如果没有更多项,则返回null):

Jeppe评论说,也可以这样写:

line = File.ReadLines().ElementAtOrDefault(lineNumber - 1);
我使用
lineNumber-1
,因为它正在跳过行,所以您希望为第1行指定
Skip(0)

如前所述,如果行未超出文件末尾,则将
line
设置为
null


如果必须使用
StreamReader
,那么您所能做的就是在循环中调用
ReadLine()
,直到达到所需的行号或文件末尾:

line = null;
for (int i = 0; i < lineNumber; ++i)
{
    if ((line = sr.ReadLine()) == null)
    {
        break; // end of file reached
    }
}
line=null;
对于(int i=0;i
您可以使用
File.ReadLines()
返回
IEnumerable
。然后,您可以使用LINQ的
Skip()
FirstOrDefault()
方法跳过所需的行数,并获取第一项(如果没有更多项,则返回null):

Jeppe评论说,也可以这样写:

line = File.ReadLines().ElementAtOrDefault(lineNumber - 1);
我使用
lineNumber-1
,因为它正在跳过行,所以您希望为第1行指定
Skip(0)

如前所述,如果行未超出文件末尾,则将
line
设置为
null


如果必须使用
StreamReader
,那么您所能做的就是在循环中调用
ReadLine()
,直到达到所需的行号或文件末尾:

line = null;
for (int i = 0; i < lineNumber; ++i)
{
    if ((line = sr.ReadLine()) == null)
    {
        break; // end of file reached
    }
}
line=null;
对于(int i=0;i
StreamReader.ReadLine方法允许您逐行读取,这将避免将整个文件加载到内存中,这对于大型文件可能是一个问题

Readline到达文件末尾时将返回null,因此使用内部计数器对其进行while循环测试将逐行读取,直到找到所需的行或EOF

private void abrirToolStripMenuItem_Click(object sender, EventArgs e)
{
    const int specifiedLine = 32;
    string line;

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        line = GetSpecifiedLine(openFileDialog1.FileName, specifiedLine);
    }

}

private string GetSpecifiedLine(string fileName, int specifiedLine)
{
    int lineCount = 0;

    using (StreamReader sr = new StreamReader(fileName))
    {
        lineCount++;
        var line = sr.ReadLine();

        while (line != null)
        {
            if (lineCount == specifiedLine)
            {
                return line;
            }
            line = sr.ReadLine();
        }

        return null;
    }
}

StreamReader.ReadLine方法允许您逐行读取,这将避免将整个文件加载到内存中,这对于大型文件可能是一个问题

Readline到达文件末尾时将返回null,因此使用内部计数器对其进行while循环测试将逐行读取,直到找到所需的行或EOF

private void abrirToolStripMenuItem_Click(object sender, EventArgs e)
{
    const int specifiedLine = 32;
    string line;

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        line = GetSpecifiedLine(openFileDialog1.FileName, specifiedLine);
    }

}

private string GetSpecifiedLine(string fileName, int specifiedLine)
{
    int lineCount = 0;

    using (StreamReader sr = new StreamReader(fileName))
    {
        lineCount++;
        var line = sr.ReadLine();

        while (line != null)
        {
            if (lineCount == specifiedLine)
            {
                return line;
            }
            line = sr.ReadLine();
        }

        return null;
    }
}

您可以尝试以下方法:将文件读取到数组,然后可以轻松有效地控制文件中的行号

        string output = "";
        string[] lines = File.ReadAllLines(String.Concat(@textBox1.Text, "\\temp\\test.txt"));
        for (int i = 0; i < lines.Length; i++)
        {
            if (lines[i].Contains("Binh"))
            {
                output = lines[i - 1];
            }
        }
字符串输出=”;
string[]lines=File.ReadAllLines(string.Concat(@textBox1.Text,“\\temp\\test.txt”);
对于(int i=0;i
您可以尝试以下方法:将文件读取到数组,然后可以轻松有效地控制文件中的行号

        string output = "";
        string[] lines = File.ReadAllLines(String.Concat(@textBox1.Text, "\\temp\\test.txt"));
        for (int i = 0; i < lines.Length; i++)
        {
            if (lines[i].Contains("Binh"))
            {
                output = lines[i - 1];
            }
        }
字符串输出=”;
string[]lines=File.ReadAllLines(string.Concat(@textBox1.Text,“\\temp\\test.txt”);
对于(int i=0;i
还有
line=File.ReadLines().ElementAtOrDefault(行号-1)。我仍然要减去
1
,因为我想您需要1个索引行号(“element at”使用基于0的索引)。我认为,它完全等同于您的
跳过
,然后是
第一个默认值
。我仍然要减去
1
,因为我想您需要1个索引行号(“element at”使用基于0的索引)。我认为这完全等同于你的
跳过
,然后是
第一个或默认值
。问题是“行”没有固定的长度。因此,如果不阅读第1行到第29行,就不能立即跳到第30行。问题是,“行”没有固定的长度。因此,如果不阅读第1行到第29行,您就不能立即跳到第30行。您的代码似乎有一个bug-
lineCount++
应该在
循环中。您的代码似乎有一个bug-
lineCount++
应该在
循环中