标签: stream

getline如何与cin一起使用?

我觉得有很多类似的问题,所以如果这是重复的话,我真的很抱歉.但是,我无法找到这个具体问题的答案.

当cin被传递给它时,我很困惑getline是如何工作的,因为我的理解是它应该在每次调用时调用cin.使用我正在阅读的书中的代码时,getline被调用几次,但只发送一个输入.除了在这些getline调用中之外,不会从任何地方调用cin对象.

这里发生了什么?当达到getline时,程序是否只是停在其轨道上并等待输入流传递包含所需分隔符的值?如果是这种情况,那么后续的getline调用是否必须等待,因为输入流已经有包含各自分隔符的数据?我跑了几个测试表明可能就是这种情况.

这是代码:

    string firstName;
    getline(cin,firstName,',');

    string lastName;
    getline(cin,lastName,',');

    string job;
    getline(cin,job,'\n');

    cout<<firstName<<" "<<lastName<<" is a "<<job<<endl;;
Run Code Online (Sandbox Code Playgroud)

如果这是一个愚蠢的问题再次抱歉,但我环顾四周,真的找不到答案.提前感谢您提供的任何帮助!

澄清:

此代码为控制台输入"First,Last,Job \n"输出"First Last is a Job"

c++ input stream

0
推荐指数
1
解决办法
9742
查看次数

将Stream传递给异步方法

我正在尝试将stream-parameter传递给异步方法,如下所示:

async void MyAsyncMethod(Stream s, int i)
{
    await Task.Factory.StartNew(() =>
        {
            SomeMethodReadingFromStream(s, i); // throws ArgumentException, "Stream was not readable."
        });
}
Run Code Online (Sandbox Code Playgroud)

当我使MyAsyncMethod不使用async-await时,一切正常.

有没有办法在异步方法中使用流?

c# asynchronous stream async-await

0
推荐指数
1
解决办法
941
查看次数

扫描仪忽略某些输入(System.in)

我最近遇到了这个令人沮丧的问题,扫描程序完全忽略了System.in输入流中的一些输入.这是一个例子:

Do you want a cookie? Yes or no.
Run Code Online (Sandbox Code Playgroud)

现在,我输入是:

yes
Run Code Online (Sandbox Code Playgroud)

结果:

Cookie for you!
Run Code Online (Sandbox Code Playgroud)

现在,如果我说不:

no
no
Run Code Online (Sandbox Code Playgroud)

结果:

No Cookie for you.
Run Code Online (Sandbox Code Playgroud)

得到它?如果我说是,那就接受它.如果我说不,我必须输入2次.

如果你真的需要一些代码.这里有一些:)

public static void main(String[] paramArgs){
    MainEW sMain = new MainEW();
    Scanner s = sMain.scanner;

    System.out.println("Enter a file path.");
    System.out.println("Example: /Users/Some_User/Desktop/Some_Folder");
    String defPath = s.next();

    System.out.println("Enter a name for the file.");
    String defName = s.next() + ".txt";

    System.out.println("Now, enter what you want to write to the file.");
    s.nextLine();
    String defText = s.nextLine();

    System.out.println("Do you want to …
Run Code Online (Sandbox Code Playgroud)

java input stream

0
推荐指数
1
解决办法
49
查看次数


使C#流的当前点成为开头

我必须读取C#流的一些字节,然后将流传递给库方法,该方法应该读取其余部分.不幸的是,这个方法调用了一个stream.Seek(0,SeekOrigin.Begin).因此,它将读取它无法理解的第一个字节.

我可以将流的开头重置为当前位置吗?我不想将整个流的其余部分复制到MemoryStream中,因为它可能非常大.

c# stream

0
推荐指数
1
解决办法
109
查看次数

如何使用python解析压缩的站点地图而不将其下载到磁盘?

我想解析压缩的站点地图,如www.example.com/sitemap.xml.gz,并收集站点地图中的所有网址,而不下载sitemap.xml.gz.

在下载sitemap.xml.gz并借助lxmlbeautifulsoup等解压缩后,有办法解析它.

def parse_sitemap_gz(url):
    r = requests.get(url, stream=True)
    if 200 != r.status_code:
    return False
    file_name = url.split('/')[-1]

    # download the sitemap file
    with open(file_name, 'wb') as f:
    if not r.ok:
        print 'error in %s'%(url)
    for block in r.iter_content(1024):
        if not block:
           break
        f.write(block) # can I parse it without writing to file
        f.flush()

    # decompress gz file
    subprocess.call(['gunzip', '-f', file_name])

    # parse xml file
    page = lxml.html.parse(file_name[0:-3])
    all_urls = page.xpath('//url/loc/text()')
    #print all_urls

    # delete sitemap file …
Run Code Online (Sandbox Code Playgroud)

python sitemap parsing stream gunzip

0
推荐指数
1
解决办法
2482
查看次数

流读C#的变化?

我已经看过这个代码示例 - 从Stream读入缓冲区:

byte[] buffer = new byte[1024 * 32];
int bytesRead;

while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

但是看第二个参数stream.Read(..,0,..)缓冲区从零开始的字节偏移量,开始存储从当前流中读取的数据.

那么每次偏移是0吗?谁说它不会覆盖这些索引的数据?

恰恰相反:我也看到了这个例子:

 int read, offset = 0;
     while(count > 0 && (read = source.Read(buffer, offset, count)) > 0) {
        offset += read;
        count -= read;
    }
Run Code Online (Sandbox Code Playgroud)

所以这里的偏移量在每次读数后都会被抵消(这对我来说似乎更合乎逻辑)

但我必须遗漏一些东西:

我的观察是对的吗?我什么时候应该使用每个案例?

NB,我的pov是网络流:发送文件.

.net c# stream

0
推荐指数
1
解决办法
133
查看次数

使用GZipStream将文本文件写入gz文件,而无需先将文本文件写入磁盘

我目前正在从几个数据库查询中生成大量输出.生成的XML文件大约为2GB.(这是一年的数据).为了节省一些磁盘空间和客户端的下载时间,我使用GZipStream类将此文件添加到压缩文件中.请参阅下文,了解我目前如何将文件压缩为gz.注意:fi对象是FileInfo.

using (FileStream inFile = fi.OpenRead())
using (FileStream outFile = File.Create(fi.FullName + ".gz"))
using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress))
{
    byte[] buffer = new byte[65536];
    int numRead;
    while ((numRead = inFile.Read(buffer, 0, buffer.Length)) != 0)
    {
        Compress.Write(buffer, 0, numRead);
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法工作正常,但要求我将2GB文本文件写入磁盘,然后再将其全部读回来,以便将其添加到GZipStream中,然后将其作为压缩文件再次写回.这似乎是浪费时间.

有没有办法直接将我的2GB字符串添加到GZipStream而无需先写入磁盘?

c# compression stream gzipstream

0
推荐指数
1
解决办法
2687
查看次数

C# - StreamReader.ReadToEnd()非常慢

我正在制作一个Web Crawler,我发现我的一个方法GetHTML非常慢,因为它使用StreamReader从HttpWebResponse对象中获取HTML字符串.

这是方法:

static string GetHTML(string URL)
      {
           HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(URL);
           Request.Proxy = null;
           HttpWebResponse Response = ((HttpWebResponse)Request.GetResponse());
           Stream RespStream = Response.GetResponseStream();
           return new StreamReader(RespStream).ReadToEnd(); // Very slow
      }
Run Code Online (Sandbox Code Playgroud)

我用秒表进行了测试,并在YouTube上使用了这种方法.

Time it takes to get an HTTP response: 500 MS

Time it takes to convert the HttpWebResponse object to a string: 550 MS
Run Code Online (Sandbox Code Playgroud)

所以HTTP请求很好,只是ReadToEnd()这么慢.

是否有任何替代ReadToEnd()方法从响应对象中获取HTML字符串?我尝试使用WebClient.DownloadString()方法,但它只是一个使用流的HttpWebRequest的包装器.

编辑:尝试使用套接字,它更快:

static string SocketHTML(string URL)
      {
           string IP = Dns.GetHostAddresses(URL)[0].ToString();
           Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           s.Connect(new IPEndPoint(IPAddress.Parse(IP), 80));
           s.Send(Encoding.ASCII.GetBytes("GET / HTTP/1.1\r\n\r\n")); …
Run Code Online (Sandbox Code Playgroud)

.net performance stream httpwebresponse streamreader

0
推荐指数
1
解决办法
4542
查看次数

如何通过块读取文件

我有点困惑,如果每个块都有自己的大小,我应该如何通过块读取大文件(> 8GB).

如果我知道块大小,它看起来像下面的代码:

using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, ProgramOptions.BufferSizeForChunkProcessing))
{
    using (BufferedStream bs = new BufferedStream(fs, ProgramOptions.BufferSizeForChunkProcessing))
    {
        byte[] buffer = new byte[ProgramOptions.BufferSizeForChunkProcessing];
        int byteRead;
        while ((byteRead = bs.Read(buffer, 0, ProgramOptions.BufferSizeForChunkProcessing)) > 0)
        {
            byte[] originalBytes;
            using (MemoryStream mStream = new MemoryStream())
            {
                mStream.Write(buffer, 0, byteRead);
                originalBytes = mStream.ToArray();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是想象一下,我已经通过块读取大文件,对每个块进行了一些编码(在该操作被更改之后块的大小)并写入另一个新文件所有已处理的块.现在我需要做相反的操作.但我不知道确切的块大小.我有个主意.在处理完每个块之后,我必须在块字节之前写入新的块大小.像这样:

Number of block bytes
Block bytes
Number of block bytes
Block bytes
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,首先我需要做的是读取chunk的标题并准确地了解什么是块大小.我只读取和写入文件字节数组.但我有一个问题 - 如何看待chunk的标题?可能是标题必须包含一些边界?

.net c# stream

0
推荐指数
1
解决办法
4115
查看次数