提问者:小点点

无法在C#中逐行读取文件


我一直在尝试为我的UNI项目逐行读取一个文件。我得到了一个我不确定我理解的错误。我需要你的经验来帮我解决这个问题。

对代码的一些说明:datas是一个列表,它有一个自定义类类型,这个类有3个属性:text1,text2,int1。v是一个简单的对象,具有与datas列表相同的自定义类类型。文本文件中的数据逐行显示,每行包含3个属性的1个值,如下所示:text1value;text2value;int1value。使用for,我试图确保将每一行读入数据列表一次。但是当我运行代码时,它会崩溃,出现以下情况:;拆分结束时(';')线条用红色下划线。我做错了什么,有人能帮帮我吗?

if (File.Exists("example.txt"))
        {
            StreamReader sr = new StreamReader("example.txt");
            int x = 0;
            while(!sr.EndOfStream)
            {
                for(int j=0; j<x; j++)
                {
                    sr.ReadLine();
                }
                string[] data = sr.ReadLine().Split(';');
                v.text1 = data[0];
                v.text2 = data[1];
                v.int1 = Convert.ToInt32(data[2]);
                datas.Add(v);
                x++;
            }
            sr.Close();
         }

共3个答案

匿名用户

我认为你正试图按照这些思路做些什么?ReadLine()将自动移动到文件中的下一行。

if (File.Exists("example.txt"))
        {
            StreamReader sr = new StreamReader("example.txt");
            while(!sr.EndOfStream)
            {
                string[] data = sr.ReadLine().Split(';');
                v.text1 = data[0];
                v.text2 = data[1];
                v.int1 = Convert.ToInt32(data[2]);
                datas.Add(v);
            }
            sr.Close();
         }

匿名用户

删除循环:

for(int j=0; j<x; j++)
{
    sr.ReadLine();
}

我假设您正在尝试定位到正确的行,但是StreamReader.ReadLine()已经提前了读取位置。你不需要循环。

所发生的情况是,循环正在读取超过文件末尾的内容,因此,中的readline

string[] data = sr.ReadLine().Split(';');

返回null,因此split()引发null引用异常。

匿名用户

你的循环就是时间。for()循环只会扰乱流程。我的猜测是,您认为每次要执行ReadLine()时都必须从头开始阅读。但是流将记住您在最后一个ReadLine()之后停止的位置。

    if (File.Exists("example.txt"))
    {
        StreamReader sr = new StreamReader("example.txt");
        while(!sr.EndOfStream)
        {
            string[] data = sr.ReadLine().Split(';');
            v.text1 = data[0];
            v.text2 = data[1];
            v.int1 = Convert.ToInt32(data[2]);
            datas.Add(v);
        }
        sr.Close();
     }