我觉得有很多类似的问题,所以如果这是重复的话,我真的很抱歉.但是,我无法找到这个具体问题的答案.
当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"
我正在尝试将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时,一切正常.
有没有办法在异步方法中使用流?
我最近遇到了这个令人沮丧的问题,扫描程序完全忽略了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) 如果不保证整个内容怎么知道何时停止阅读?
我必须读取C#流的一些字节,然后将流传递给库方法,该方法应该读取其余部分.不幸的是,这个方法调用了一个stream.Seek(0,SeekOrigin.Begin).因此,它将读取它无法理解的第一个字节.
我可以将流的开头重置为当前位置吗?我不想将整个流的其余部分复制到MemoryStream中,因为它可能非常大.
我想解析压缩的站点地图,如www.example.com/sitemap.xml.gz,并收集站点地图中的所有网址,而不下载sitemap.xml.gz.
在下载sitemap.xml.gz并借助lxml或beautifulsoup等解压缩后,有办法解析它.
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) 我已经看过这个代码示例 - 从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是网络流:发送文件.
我目前正在从几个数据库查询中生成大量输出.生成的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而无需先写入磁盘?
我正在制作一个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) 我有点困惑,如果每个块都有自己的大小,我应该如何通过块读取大文件(> 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的标题?可能是标题必须包含一些边界?
stream ×10
c# ×6
.net ×4
asynchronous ×2
input ×2
async-await ×1
c++ ×1
compression ×1
gunzip ×1
gzipstream ×1
http ×1
java ×1
parsing ×1
performance ×1
python ×1
sitemap ×1
streamreader ×1