从Unity3d读取文本文件

问题描述 投票:0回答:4

我在从程序外部的文本文件读取的脚本中出现错误。 错误是

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 行,所有值都在单独的行上。

c# unity-game-engine filestream lines
4个回答
2
投票

新的 Filestream 上没有关闭 "(" ...);但我会假设将代码复制粘贴到 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

    ),或

    
    

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

很可能您的缓冲区已经包含文件中的所有内容。您的文件是如此之小,以至于文件流对象可能会一次性读取整个文件,尽管这并不能得到保证。

由于您的字符串缓冲区包含文件中的所有字符,因此您实际上正在尝试将

"12\n5\n6\n0"

解析为整数,并且解析器因换行符而窒息。由于换行符不是数字,因此它不知道如何解释它们。

    


0
投票
TextAsset

数据类型来访问Unity3D中的文本文件内容。

尝试以下代码,

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Global : MonoBehaviour { public TextAsset textFile; // Start is called before the first frame update void Start() { getFileContents(); } // Update is called once per frame void Update() { } void getFileContents() { string data = textFile.text.Split('\n'); for(line in data) { Debug.Log(line); } } }



0
投票

import System.IO; var filename = "data.txt"; void Start () { var source = new StreamReader(Application.dataPath + "/" + filename); var fileContents = source.ReadToEnd(); source.Close(); var lines = fileContents.Split("\n"); for(line in lines) { print(line); } }

© www.soinside.com 2019 - 2024. All rights reserved.