我在脚本中发生错误,该脚本从程序外部的文本文件中读取。 错误是
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行,所有值都在单独的行上。
答案 0 :(得分:2)
你的新文件流(“......)没有关闭”;但是当我将你的代码复制到Stackoverflow时,我会认为这是一个问题。
你得到的错误可能是因为你试图将空格解析为int,这不会起作用;输入字符串(在这种情况下为“”)的格式不正确(int)。
在空格(Split.(' '))上拆分行并解析创建的数组中的每个项目。
答案 1 :(得分:1)
一些问题:
fs.Read(b, 0, b.Length)
可以读取一个字节或全部字节。读取这样的文本文件的正常方式是使用StreamReader而不是FileStream。 Streamreader有一个方便的构造函数,用于打开以相同方式工作的文件,但它可以逐行读取并且更方便。这是文档和一个很好的例子:https://msdn.microsoft.com/en-us/library/f2ke0fzy(v=vs.110).aspx
如果您坚持直接从文件流中阅读,则需要
在循环外解析字符串,这样您就可以确定已将整个文件读入字节缓冲区(b
)或
逐字节解析新内容,直到找到特定的分隔符(例如空格或换行符),然后解析缓冲区中的所有内容并重置缓冲区。
您的缓冲区很可能已包含文件中的所有内容。你的文件太小了,文件流对象可能只是一次性读取整个内容,即使这不是保证。
由于您的字符串缓冲区包含文件中的所有字符,因此您实际上正在尝试将"12\n5\n6\n0"
解析为整数,并且解析器会对换行符进行阻塞。由于换行符是非数字的,因此不知道如何解释它们。