叫写!输出生锈包裹在Ok()中的字符串

时间:2019-05-31 19:14:50

标签: rust output

当尝试读取文件并将其写入另一个文件时,使用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?)?;

1 个答案:

答案 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都将导致编译器引发错误,因为lineResult<String>,并且无法分配给固定为其他类型的变量;现在您知道line实际上是Result<String>,而不是预期的String