当尝试读取文件并将其写入另一个文件时,使用write!时,每一行都被包裹在Ok()中。我一直无法发现自己在做错什么,希望有人会有所想法。
我已经能够将问题隔离到与{:#?}有关的问题上。
如果我在“”中添加规则文本,则可以正常打印并显示在Ok()之外。还有其他人遇到吗?
谢谢
use std::fs::File;
use std::io::{BufReader, BufRead};
use std::io::{Write, Error};
fn main() -> Result<(), Error> {
let ofile = File::open("test.xml")?;
let mut new_file = File::create("output.xml")?;
let input = BufReader::new(ofile);
for line in input.lines() {
write!(new_file, "{:#?}", line)?;
}
Ok(())
}
输入
<?xml version = '1.0' encoding = 'UTF-8'?>
<Configuration xmlns="configuration" configType="TEST_RULE" actionType="NEW RULE">
<Reference>
<Code>AV</Code>
<Name>TESTER</Name>
</Reference>
<ConfigItems>
<ConfigItem>
<description>Test Description</description>
</ConfigItem>
</ConfigItems>
</Configuration>
结果输出
Ok(
"<?xml version = \'1.0\' encoding = \'UTF-8\'?>"
)Ok(
"<Configuration xmlns=\"configuration\" configType=\"TEST_RULE\" actionType=\"NEW RULE\">"
)Ok(
" <Reference>"
)Ok(
" <Code>AV</Code>"
)Ok(
" <Name>TESTER</Name>"
)Ok(
" </Reference>"
)Ok(
" <ConfigItems>"
)Ok(
" <ConfigItem>"
)Ok(
" <description>Test Description</description>"
)Ok(
" </ConfigItem>"
)Ok(
" </ConfigItems>"
)Ok(
"</Configuration>"
)
修复: 根据下面的响应,我更改了写法!以下内容,并解决了该问题。
write!(new_file, "{}\n", line?)?;
答案 0 :(得分:0)
在.lines()
上调用BufReader
会给您一个io::Lines
,其关联的Item
类型是std::io::Result<String>
。也就是说,在.lines()
上进行迭代时,迭代器将生成Ok(String)
(如果读取成功)或Err(io::Error)
(如果读取下一行时发生io错误)。 。这就是为什么您看到Ok(...)
被打印的原因。
常见的情况如下:
for line in input.lines() {
// If `line` is `Ok(String)`, re-assign `line`; return the error otherwise.
let line = line?;
// Possible read-errors have been dealt with, `line` is a `String`.
write!(new_file, "{:#?}", line)?;
}
如果您对某些类型感到困惑,通常也可以将其分配给期望类型或“荒谬”类型的变量,以使编译器对您大吼大叫。
for line in input.lines() {
let line: String = line; // line should be a String, right?
let line: () = line; // I have no idea what line is, but it's not () for sure
write!(new_file, "{:#?}", line)?;
}
let line: ... = line
都将导致编译器引发错误,因为line
是Result<String>
,并且无法分配给固定为其他类型的变量;现在您知道line
实际上是Result<String>
,而不是预期的String
。