- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望这段代码在每个循环中读取 3 个字节而不打印,但是文件的每 8000 个字节左右,它只读取两个字节:
use std::error::Error;
use std::fs::File;
use std::io::prelude::*;
use std::io::BufReader;
use std::io::BufWriter;
use std::io::SeekFrom;
use std::path::Path;
fn main() -> std::io::Result<()> {
let sequence: [u8; 3] = [1, 2, 3];
let file_path = Path::new("./test_file");
//fill a file with 1,2,3,1,2,3...
{
let mut output_file: std::io::BufWriter<std::fs::File>;
output_file = BufWriter::new(File::create(file_path)?);
for _i in 0..100000 {
match output_file.write(&sequence) {
Err(why) => panic!("could not write {}", Error::description(&why)),
Ok(_) => {}
}
}
}
//read the file 3 bytes at a time
{
let mut input_file: std::io::BufReader<std::fs::File>;
input_file = BufReader::new(File::open(file_path)?);
for i in 0..100000 {
let mut raw = [0; 3];
let result = match input_file.read(&mut raw) {
Err(why) => panic!("could not read {}", Error::description(&why)),
Ok(x) => x,
};
// print if something other than 3 bytes were read
if result != 3 {
println!(
"file pos {}, data read {}, buffer = [{},{},{}]",
i * 3,
result,
raw[0],
raw[1],
raw[2]
);
}
}
}
Ok(())
}
在 Mac 上使用 rustc problem.rs
编译并使用 ./problem
运行。
输出:
file pos 8190, data read 2, buffer = [1,2,0]
file pos 16383, data read 2, buffer = [3,1,0]
file pos 24576, data read 2, buffer = [2,3,0]
file pos 32769, data read 2, buffer = [1,2,0]
file pos 40962, data read 2, buffer = [3,1,0]
file pos 49155, data read 2, buffer = [2,3,0]
file pos 57348, data read 2, buffer = [1,2,0]
file pos 65541, data read 2, buffer = [3,1,0]
...
这似乎表明与内部 8192 大小的缓冲区有关。
为什么我每次得不到3个字节?我一次读取 5 个字节得到类似的结果。
最佳答案
默认缓冲区大小为 8KB。查看docs for BufReader::new
.
8192 字节不能被 3 整除,因此您会在每个缓冲区的末尾得到几个尾随字节。
您可以使用 with_capacity
constructor 将缓冲区大小设置为 8KB 以外的值.
关于file - 为什么 BufReader::read 并不总是完全填满给定的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58413733/
我正在尝试从文件中读取一些行,跳过前几行并打印其余行,但在移动后我不断收到有关已用值的错误: 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
我是一名优秀的程序员,十分优秀!