IOStream运算符<<;从C++到C#的转换

本文关键字:lt 转换 运算符 IOStream C++ | 更新日期: 2023-09-27 18:25:46

我正在尝试将一些旧的C++代码转换为C#,但很难理解以下代码的作用以及如何将其转换为C#。

ifstream fin;
fin.open(file, ios::nocreate);
if (!fin)
{
    m_iErrorNumber = 1567;
    num = 0.0;
}
else
{
    for (int x = 0; x < count; x++)
    {
        fin >> num;  //  <==== THIS LINE IS PROBLEM!!
    }
};
fin.close();

IOStream运算符<<;从C++到C#的转换

C++标准库重载位移运算符(<<>>),分别表示"写入流"answers"从流读取"。在这种情况下,fin是一个文件流;fin >> num意味着从文件中读取(直到下一个空白字符),解析数据以匹配变量num(整数)的格式,并将其存储到num中。

这可能与C++代码的语义略有不同,但应该相对相似:

IEnumerable<string> ReadWhiteSpaceSeparated(string filename)
{
    using(var lines = File.ReadLines(filename))
    {
        return lines.SelectMany(line => line.Split(new []{' ',''t', ''r', ''n'}, StringSplitOptions.RemoveEmptyEntries));
    }
}
IEnumerable<string> ReadDoubles(string filename)
{
     return ReadWhiteSpaceSeparated(filename)
         .Select(s => double.Parse(s, CultureInfo.InvariantCulture));
}

然后,您可以使用ReadDoubles(filename).Take(count) 从文件中读取count替身

在这种情况下,>>运算符将数据从文件流流流式传输到我认为的双精度中。以下是代码在C#中的样子(如果您只是使用浮点,请将8改为4):

using (var stream = System.IO.File.Open(file, System.IO.FileMode.Open))
{ 
    var data = new byte[8]; // temp variable to hold byte data from stream
    for(var x = 0; x < count; ++x)
    {
        stream.Read(data, 0, 8);
        num = System.BitConverter.ToDouble(data, 0); // convert bytes to double
        // do something with num
    }
}