从Unity3d

时间:2017-01-24 01:10:39

标签: c# unity3d filestream lines

我在脚本中发生错误,该脚本从程序外部的文本文件中读取。 错误是

  

FormatException:输入字符串的格式不正确

它显然有什么不对,但我只是不明白为什么它无法正确阅读。 我的代码:

using (FileStream fs = new FileStream(@"D:\Program Files (x86)\Steam\SteamApps\common\blabla...to my file.txt))
        {
            byte[] b = new byte[1024];
            UTF8Encoding temp = new UTF8Encoding(true);

            while (fs.Read(b, 0, b.Length) > 0)
            {
                //Debug.Log(temp.GetString(b));
                var converToInt = int.Parse(temp.GetString(b));
                externalAmount = converToInt;

            }
            fs.Close();
        }

文本文件有4行值。 每一行代表游戏中的一个对象。我所要做的就是读取这些值。不幸的是我收到了我无法解释的错误。 那么如何在不收到错误的情况下阅读新行呢?

文本文件如下所示

12
5
6
0

不再有4行,所有值都在单独的行上。

2 个答案:

答案 0 :(得分:2)

你的新文件流(“......)没有关闭”;但是当我将你的代码复制到Stackoverflow时,我会认为这是一个问题。

你得到的错误可能是因为你试图将空格解析为int,这不会起作用;输入字符串(在这种情况下为“”)的格式不正确(int)。

在空格(Split.(' '))上拆分行并解析创建的数组中的每个项目。

答案 1 :(得分:1)

一些问题:

问题1

fs.Read(b, 0, b.Length)可以读取一个字节或全部字节。读取这样的文本文件的正常方式是使用StreamReader而不是FileStream。 Streamreader有一个方便的构造函数,用于打开以相同方式工作的文件,但它可以逐行读取并且更方便。这是文档和一个很好的例子:https://msdn.microsoft.com/en-us/library/f2ke0fzy(v=vs.110).aspx

如果您坚持直接从文件流中阅读,则需要

  • 在循环外解析字符串,这样您就可以确定已将整个文件读入字节缓冲区(b)或

  • 逐字节解析新内容,直到找到特定的分隔符(例如空格或换行符),然后解析缓冲区中的所有内容并重置缓冲区。

问题2

您的缓冲区很可能已包含文件中的所有内容。你的文件太小了,文件流对象可能只是一次性读取整个内容,即使这不是保证。

由于您的字符串缓冲区包含文件中的所有字符,因此您实际上正在尝试将"12\n5\n6\n0"解析为整数,并且解析器会对换行符进行阻塞。由于换行符是非数字的,因此不知道如何解释它们。