Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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#_Unity3d_Text_Binaryfiles - Fatal编程技术网

C# 如何在C语言中高效地将文本文件转换为二进制文件#

C# 如何在C语言中高效地将文本文件转换为二进制文件#,c#,unity3d,text,binaryfiles,C#,Unity3d,Text,Binaryfiles,我检查了几种将文本文件转换为二进制文件的方法,并在这里找到了一些答案。然而,由于Unity.NET的兼容性,它们中的大多数让我感到困惑,我也对如何将文本转换为二进制的结构感到困惑 我有一个文本文件(导出的点云),它保存点在三维空间中的位置和颜色信息,如下所示: string[] buffer; for (int i = 0; i < Area.nPoints; i++) { buffer = sr.ReadLine().Split();

我检查了几种将文本文件转换为二进制文件的方法,并在这里找到了一些答案。然而,由于Unity.NET的兼容性,它们中的大多数让我感到困惑,我也对如何将文本转换为二进制的结构感到困惑

我有一个文本文件(导出的点云),它保存点在三维空间中的位置和颜色信息,如下所示:

 string[] buffer;

    for (int i = 0; i < Area.nPoints; i++)
    {
        buffer = sr.ReadLine().Split();

        Area.AddPoint(new Vector3(float.Parse(buffer[0]), 
        float.Parse(buffer[1]), float.Parse(buffer[2])));
    }
X Y Z颜色值
-0.680891-90.6809 0 204 255

我在阅读本文时使用如下脚本在运行时创建网格:

 string[] buffer;

    for (int i = 0; i < Area.nPoints; i++)
    {
        buffer = sr.ReadLine().Split();

        Area.AddPoint(new Vector3(float.Parse(buffer[0]), 
        float.Parse(buffer[1]), float.Parse(buffer[2])));
    }
string[]缓冲区;
对于(int i=0;i
这是可行的,但因为我读了行并拆分了它们,所以速度非常慢,我的文本文件中有大约7500万行(点)。我发现我可以把它转换成二进制,读起来会比我做的快很多。然而,现在转换成二进制部分相当慢,我想问一下我转换的方式

void WriteValues()
{
    string[] buffer;

    for (int i = 0; i < numPoints; i++)
    {
        buffer = sr.ReadLine().Split();
        for (int j = 0; i < 3; i++)
        {
            wr.Write(float.Parse(buffer[j]));
        }           
    }        
    wr.Close();
}
void writevalue()
{
字符串[]缓冲区;
对于(int i=0;i
然后我用
BinaryReader.ReadSingle()
阅读它,但这比直接从文本中阅读要花费更多的时间,因为我再次阅读并拆分了行

我的问题是,我能读,比如说,接下来1000行缓冲它,然后写,而不是读每一行吗?这会有所不同吗。如果是这样,我怎样才能每1000行使用一次流

另外,当我将一行转换为二进制时,如何在不拆分字符串的情况下读取行中的每个浮点?提前感谢您的帮助


我正在尝试使用增强现实技术在我的手机中可视化点云。因此,我想进行扫描,导出点云,将其导入Unity,并使用这些点创建网格,而不进行三角剖分,但使用我的初始方法,导入它需要15-18分钟。转换成二进制后,不到3分钟就可以了。但是,这次转换为二进制文件需要花费大量时间:)

如果读取速度较慢,则读取、写入不同的文件格式,然后从该文件中读回将更加缓慢。你只是在给已经很慢的东西添加更多的动作。。。也许你应该看看如何改变阅读文本文件的方式

如果您不熟悉如何在C#中使用内置库进行序列化/反序列化,您应该先阅读以下内容:

以下链接显示了如何实现二进制序列化:

但是,如果您没有编写初始文件,则只需要编写一个自定义反序列化程序(这基本上就是您所做的,而无需实现相关的.NET模式)。也许可以尝试使用
BufferedStream
,看看这是否有帮助,即:

using (FileStream fs = File.Open(fileName, ..... ))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
        string s;
        while ((s = sr.ReadLine()) != null)
        {
            //your code   
        }
}

另外,值得一看这个库,它可以帮助您完成这项任务:-看这个例子:

如果读取速度慢,那么读取、写入到不同的文件格式,然后从该文件中读回将更慢。你只是在给已经很慢的东西添加更多的动作。。。也许你应该看看如何改变阅读文本文件的方式

如果您不熟悉如何在C#中使用内置库进行序列化/反序列化,您应该先阅读以下内容:

以下链接显示了如何实现二进制序列化:

但是,如果您没有编写初始文件,则只需要编写一个自定义反序列化程序(这基本上就是您所做的,而无需实现相关的.NET模式)。也许可以尝试使用
BufferedStream
,看看这是否有帮助,即:

using (FileStream fs = File.Open(fileName, ..... ))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
        string s;
        while ((s = sr.ReadLine()) != null)
        {
            //your code   
        }
}

另外,值得一看这个库,它可以帮助您完成这项任务:-看这个例子:

,所以一个相当快速的读取方法是使用缓冲文件流。没有浮点解析,在我的机器上读取需要14秒。。。。74秒,带浮点解析(我只是求和,因为我没有unity可玩)

出于兴趣,我还更改了代码,将数据作为浮点流(三元组)写出

读入

var sw = new Stopwatch();
sw.Start();
double sum = 0;
var fs = new FileStream("demo.bin", FileMode.Open, FileAccess.Read);
using (var bs = new BufferedStream(fs))
using (var r = new BinaryReader(bs))
{
    for (int i = 0; i < 75000000; i++)
    {
        var x = r.ReadSingle();
        var y = r.ReadSingle();
        var z=r.ReadSingle();
        sum += x + y + z;
    }
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds / 1000M);
Console.WriteLine(sum);
var sw=新秒表();
sw.Start();
双和=0;
var fs=newfilestream(“demo.bin”、FileMode.Open、FileAccess.Read);
使用(var bs=新缓冲流(fs))
使用(var r=新二进制读取器(bs))
{
对于(int i=0;i<75000000;i++)
{
var x=r.ReadSingle();
变量y=r.ReadSingle();
var z=r.ReadSingle();
总和+=x+y+z;
}
}
sw.Stop();
控制台写入线(sw.ElapsedMilliseconds/1000M);
控制台写入线(总和);
大约需要9秒

为了完整起见,我使用以下代码生成演示文件

   var random = new Random();
    File.WriteAllText("demo.txt", "X         Y        Z colorvalues\r\n");
    using (var fs = new FileStream("demo.bin", FileMode.Create, FileAccess.Write, FileShare.None))
    using (var bw = new BinaryWriter(fs))
    using (var writer = File.AppendText("demo.txt"))
    {
        for (int i = 0; i < 75000000; i++)
        {
            var x = (float) random.NextDouble() * 200;
            var y = (float) random.NextDouble() * 200;
            var z = (float) random.NextDouble() * 200;
            var c = Enumerable.Range(0, 4).Select(n => random.Next(0, 255)).ToArray();
            writer.WriteLine($"{x} {y} {z} {c[0]} {c[1]} {c[2]} {c[3]}");
            bw.Write(x);
            bw.Write(y);
            bw.Write(z);
        }
}
var random=new random();
File.writealText(“demo.txt”,“X Y Z colorvalues\r\n”);
使用(var fs=new FileStream(“demo.bin”、FileMode.Create、FileAccess.Write、FileShare.None))
使用(var bw=newbinarywriter(fs))
使用(var writer=File.AppendText(“demo.txt”))
{
对于(int i=0;i<75000000;i++)
{
var x=(float)random.NextDouble()*200;
变量y=(float)random.NextDouble()*200;
var z=(float)random.NextDouble()*200;
var c=Enumerable.Range(0,4)。选择(n=>random.Next(0255)).ToArray();
writer.WriteLine($“{x}{y}{z}{c[0]}{c[1]}{c[2]}{c[3]}”);
bw.Write(x);
bw.写入(y);
bw.写入(z);
}
}
所以