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

C# C语言中的字符串流#

C# C语言中的字符串流#,c#,.net,stringstream,C#,.net,Stringstream,我希望能够从我创建的类中构建一个字符串,该类派生自流。具体来说,我希望能够编写如下代码: void Print(Stream stream) { // Some code that operates on a Stream. } void Main() { StringStream stream = new StringStream(); Print(stream); string myString = stream.GetResult(); } 我可以创建一

我希望能够从我创建的类中构建一个字符串,该类派生自
。具体来说,我希望能够编写如下代码:

void Print(Stream stream) {
    // Some code that operates on a Stream.
}

void Main() {
    StringStream stream = new StringStream();
    Print(stream);
    string myString = stream.GetResult();
}
我可以创建一个名为
StringStream
的类来实现这一点吗?或者已经有这样的课程了

更新:在我的示例中,
Print
方法是在第三方外部DLL中提供的。如您所见,
Print
所期望的参数是一个
。打印到
流后,我希望能够以字符串形式检索其内容。

您可以使用将值写入字符串。它提供了一种类似流的语法(虽然不是从
stream
)与底层
StringBuilder

一起工作,因为Print()方法可能处理文本数据,您能否重写它以接受
TextWriter
参数

该库提供了一个
StringWriter:TextWriter
,但不提供StringStream。我想你可以通过包装MemoryStream来创建一个,但这真的有必要吗


更新后:

void Main() 
{
  string myString;  // outside using

  using (MemoryStream stream = new MemoryStream ())
  {
     Print(stream);
     myString = Encoding.UTF8.GetString(stream.ToArray());
  }
  ... 

}

您可能希望将UTF8更改为ASCII,具体取决于Print()使用的编码。

您有许多选项:

一种是不使用流,而是使用TextWriter

   void Print(TextWriter writer) 
   {
   }

   void Main() 
  {
    var textWriter = new StringWriter();
    Print(writer);
    string myString = textWriter.ToString();
   }
TextWriter
可能是您的
print
功能的适当抽象级别。 流的目标是写入二进制数据,而TextWriter工作在更高的抽象级别,专门用于输出字符串

如果您的动机是希望
Print
函数写入文件,那么您也可以从文件流中获得文本编写器

void Print(TextWriter writer) 
{
}

void PrintToFile(string filePath) 
{
     using(var textWriter = new StreamWriter(filePath))
     {
         Print(writer);
     }
}
如果您确实想要流,可以查看
MemoryStream

您可以使用和类的串联:


您可以从字符串创建MemoryStream,并在任何需要流的第三方函数中使用它。在本例中,MemoryStream在UTF8.GetBytes的帮助下提供了Java的StringStream的功能

从字符串示例 举例
我在这里看到了很多好的答案,但是没有一个能直接解决C#中缺少StringStream类的问题。所以我写了一篇我自己的

public class StringStream : Stream
{
    private readonly MemoryStream _memory;
    public StringStream(string text)
    {
        _memory = new MemoryStream(Encoding.UTF8.GetBytes(text));
    }
    public StringStream()
    {
        _memory = new MemoryStream();
    }
    public StringStream(int capacity)
    {
        _memory = new MemoryStream(capacity);
    }
    public override void Flush()
    {
        _memory.Flush();
    }
    public override int Read(byte[] buffer, int offset, int count)
    {
        return  _memory.Read(buffer, offset, count);
    }
    public override long Seek(long offset, SeekOrigin origin)
    {
        return _memory.Seek(offset, origin);
    }
    public override void SetLength(long value)
    {
        _memory.SetLength(value);
    }
    public override void Write(byte[] buffer, int offset, int count)
    {
        _memory.Write(buffer, offset, count);
    }
    public override bool CanRead => _memory.CanRead;
    public override bool CanSeek => _memory.CanSeek;
    public override bool CanWrite => _memory.CanWrite;
    public override long Length =>  _memory.Length;
    public override long Position
    {
        get => _memory.Position;
        set => _memory.Position = value;
    }
    public override string ToString()
    {
        return System.Text.Encoding.UTF8.GetString(_memory.GetBuffer(), 0, (int) _memory.Length);
    }
    public override int ReadByte()
    {
        return _memory.ReadByte();
    }
    public override void WriteByte(byte value)
    {
        _memory.WriteByte(value);
    }
}
一个使用它的例子

        string s0 =
            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor\r\n" +
            "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud\r\n" +
            "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor\r\n" +
            "in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\r\n" +
            "occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\r\n";
        StringStream ss0 = new StringStream(s0);
        StringStream ss1 = new StringStream();
        int line = 1;
        Console.WriteLine("Contents of input stream: ");
        Console.WriteLine();
        using (StreamReader reader = new StreamReader(ss0))
        {
            using (StreamWriter writer = new StreamWriter(ss1))
            {
                while (!reader.EndOfStream)
                {
                    string s = reader.ReadLine();
                    Console.WriteLine("Line " + line++ + ": " + s);
                    writer.WriteLine(s);
                }
            }
        }

        Console.WriteLine();
        Console.WriteLine("Contents of output stream: ");
        Console.WriteLine();
        Console.Write(ss1.ToString());

是否考虑使用<代码> StringBuilder < /代码>?如果<代码>流<代码>不代表<代码>字符串< /代码>会发生什么?你到底想用这样的东西实现什么?你能给我们提供外部API方法的签名吗?GetBuffer()的可能副本会为我返回整个缓冲区,并带有一个零尾。ToArray()对我有效。@Fox32:请注意,
ToArray()
创建了一个新数组,而Areas
GetBuffer()
返回内部数组。这个答案用于从流中获取字符串。对于反向(从字符串中获取流),可以执行
var stream=newmemorystream(Encoding.UTF8.GetBytes(“string”)我不明白为什么这个答案被接受,因为它不能解决海报的问题。StringWriter不是流,因此不能作为流使用。@中微子OP的代码不需要使用
-在这种情况下,这是一个更好的设计选择。我阅读了OP的语句“method Print in external dll。我需要使用流”,意思是打印要么是无法修改的外部代码,或者其他设计约束要求在其方法签名中使用流。在这种情况下,重构Print的签名并不能回答前面提到的问题,尽管这个问题可能只是措辞含糊不清writer@Isaac这直接回答了原始海报的问题。如果您试图从字符串中读取
,则可以使用re:您也可以从文件流中获取文本编写器。是的,我明白了。我想我应该发布一个与标题相符的答案,因为这是大多数人来这里寻找的。
stream.Seek(0, SeekOrigin.Begin);
string s;
using (var readr = new StreamReader(stream))
{
    s = readr.ReadToEnd();
}
//and don't forget to dispose the stream if you created it
public class StringStream : Stream
{
    private readonly MemoryStream _memory;
    public StringStream(string text)
    {
        _memory = new MemoryStream(Encoding.UTF8.GetBytes(text));
    }
    public StringStream()
    {
        _memory = new MemoryStream();
    }
    public StringStream(int capacity)
    {
        _memory = new MemoryStream(capacity);
    }
    public override void Flush()
    {
        _memory.Flush();
    }
    public override int Read(byte[] buffer, int offset, int count)
    {
        return  _memory.Read(buffer, offset, count);
    }
    public override long Seek(long offset, SeekOrigin origin)
    {
        return _memory.Seek(offset, origin);
    }
    public override void SetLength(long value)
    {
        _memory.SetLength(value);
    }
    public override void Write(byte[] buffer, int offset, int count)
    {
        _memory.Write(buffer, offset, count);
    }
    public override bool CanRead => _memory.CanRead;
    public override bool CanSeek => _memory.CanSeek;
    public override bool CanWrite => _memory.CanWrite;
    public override long Length =>  _memory.Length;
    public override long Position
    {
        get => _memory.Position;
        set => _memory.Position = value;
    }
    public override string ToString()
    {
        return System.Text.Encoding.UTF8.GetString(_memory.GetBuffer(), 0, (int) _memory.Length);
    }
    public override int ReadByte()
    {
        return _memory.ReadByte();
    }
    public override void WriteByte(byte value)
    {
        _memory.WriteByte(value);
    }
}
        string s0 =
            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor\r\n" +
            "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud\r\n" +
            "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor\r\n" +
            "in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\r\n" +
            "occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\r\n";
        StringStream ss0 = new StringStream(s0);
        StringStream ss1 = new StringStream();
        int line = 1;
        Console.WriteLine("Contents of input stream: ");
        Console.WriteLine();
        using (StreamReader reader = new StreamReader(ss0))
        {
            using (StreamWriter writer = new StreamWriter(ss1))
            {
                while (!reader.EndOfStream)
                {
                    string s = reader.ReadLine();
                    Console.WriteLine("Line " + line++ + ": " + s);
                    writer.WriteLine(s);
                }
            }
        }

        Console.WriteLine();
        Console.WriteLine("Contents of output stream: ");
        Console.WriteLine();
        Console.Write(ss1.ToString());