- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以编写一个调用BufRead::fill_buf
直到io::ErrorKind::Interrupted
的函数?不使用 unsafe 就不再发生?
对于不安全的代码,它是:
use std::{
io::{self, BufRead},
slice,
};
fn fill_buf_and_ignore_interrupts(reader: &mut impl BufRead) -> io::Result<&[u8]> {
let (buf_ptr, buf_len) = loop {
match reader.fill_buf() {
Ok(buf) => (buf.as_ptr(), buf.len()),
Err(e) => {
if e.kind() != io::ErrorKind::Interrupted {
return Err(e);
}
}
}
};
Ok(unsafe { slice::from_raw_parts(buf_ptr, buf_len) })
}
如果我尝试return
或break
Ok(buf)
,我从借用检查器中得到一个错误:
error[E0499]: cannot borrow `*reader` as mutable more than once at a time
--> src/lib.rs:8:15
|
6 | fn fill_buf_and_ignore_interrupts(reader: &mut impl BufRead) -> io::Result<&[u8]> {
| - let's call the lifetime of this reference `'1`
7 | let (buf_ptr, buf_len) = loop {
8 | match reader.fill_buf() {
| ^^^^^^ mutable borrow starts here in previous iteration of loop
9 | Ok(buf) => return Ok(buf),
| ------- returning this value requires that `*reader` is borrowed for `'1`
我试图用递归替换循环,但错误仍然存在。我也尝试过使用 #![feature(nll)]
,但它也不起作用。
最佳答案
您不能,也不应该出于下面突出显示的原因(它们与引用返回或不安全
无关)。 fill_buf
由于文档中的一个重要警告,它并不像您认为的那样工作:
Returns the contents of the internal buffer, filling it with more data from the inner reader if it is empty.
换句话说,如果 trait 正确实现并遵循文档中规定的契约,则在没有 consume
的情况下对 fill_buf
的后续调用将是空操作。因此,如果您在调用 fill_buf
的任何地方忘记了该要求,那么只做一个而没有另一个会充满风险。
两种解决方案:
BufReader
在很多其他语言中所做的),只需 BufRead::read_to_end()
, BufRead::read_line()
或 BufRead::read_until()
。如果你能识别一个分隔符,read_until
可以很容易地被处理成一个可迭代的结构Pattern
或单个字节,BufRead
涵盖了它。作为一个简短的总结,fill_buf
并没有按照您的想法行事,您不需要多次调用它而不消耗缓冲区的内部状态。如果您不想这样做,那么 BufRead
的低级方法不是完成这项工作的工具。
关于loops - 是否可以编写一个调用 BufRead::fill_buf 的函数,直到中断错误不再发生而不使用 unsafe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57832526/
我正在尝试从文件中读取一些行,跳过前几行并打印其余行,但在移动后我不断收到有关已用值的错误: use std::fs::File; use std::io::{self, BufRead, BufRe
我正在尝试对一个 io::stdio 实例和一个包装文件的 BufReader 进行类型双关,这样我就可以在假定缓冲输入源的情况下编写代码。我已经尝试了几种尝试将 io::stdio() 转换为 Bu
我的应用程序使用一个非常大的文件,并从小窗口内的各种偏移量执行许多非常小的读取。我将直接文件读取替换为通过 BufReader 读取。然后我使用进程监视器(来自 Sysinternals 套件)检查了
我正在尝试创建一个函数来返回字符串在文件中的位置。这是我的代码: use std::{ fs::File, io::{BufRead, BufReader, Seek, SeekFro
为了更好地使用 Rust,我决定实现一个简单的词法分析器来逐行分析一些文档。 因为我必须在特性 BufRead 的行上至少迭代两次,所以我正在克隆我的 BufRead 的行,但我得到以下错误: err
第二次尝试访问变量sentences 导致value used here after move ,我想了解如何在不引起此问题的情况下存储总数。 我试图复制迭代器,但找不到使其工作的方法或正确的方法。
这个问题在这里已经有了答案: Why is it possible to implement Read on an immutable reference to File? (1 个回答) 关闭 6
我想打开一个文件并使用 lines() 作为 BufReader 读取其内容。我还希望能够查找到文件末尾并写入一些新行。 使用 let mut file 让我写入文件,但是一旦我将文件提供给 BufR
我的意图是访问 TcpStream 并在将 TcpStream 作为属性保存的结构的两种不同方法中执行两次读取操作。 第一个操作执行良好,但是当我尝试在第二个方法上加载剩余字节时,无法填充缓冲区。 我
BufReadCmd对于加载远程文件非常有用,例如当你:e protocol://some/file.txt 当您想设置 filetype=text 时,诀窍就来了。完成后 BufReadCmd .这
This question already has answers here: How to get the current cursor position in file? (2个答案) How t
我正在使用 fdpass crate通过 unix 套接字将文件描述符从一个进程发送到另一个进程(我不关心兼容性,只有 unix 没问题)。 使用 mio 我设法监听这些文件描述符上的事件: let
在下面的代码中创建字符串缓冲区是我发现的最快方法,因为没有完成分配重新分配如果我没理解错的话 pub extern fn rust_print_file() -> *mut PackChar {
我希望这段代码在每个循环中读取 3 个字节而不打印,但是文件的每 8000 个字节左右,它只读取两个字节: use std::error::Error; use std::fs::File; use
看完 std::io::BufReader 文档,我不确定如何最好地传递 BufReader功能之间。允许多种排列,但哪种排列最好? 我有一个接受文件的函数: use std::{fs::File,
我想从 TCPStream 中读取一行,向其中写入另一行,然后重复。问题是 BufReader::new 取得了我的 TCPStream 变量的所有权: let stream = ...; // TC
我正在尝试了解 Rust 中的一些基本内容。 我想创建一个工具,从一个文件中读取 512 个字节,并将这些字节复制到另一个文件中。然后从输入文件中取出接下来的 8 个字节并跳过它们。然后从输入文件中取
我有一个相当简单的代码,它使用 TcpStream 和 SslStream,使用 BufReader 逐行读取套接字。有时迭代器只是停止返回任何带有 Ok(0) 的数据: let mut stream
我是一个新的 vim 用户,按照本指南使 vim 自动缩进 python 代码并标记不必要的空格:https://realpython.com/blog/python/vim-and-python-a
我的 vim 配置有问题... 打开 python (.py) 文件时出现此错误: Error detected while processing BufRead Auto commands for
我是一名优秀的程序员,十分优秀!