Rust 呼叫写信!输出字符串是否被Ok()包裹在铁锈中

Rust 呼叫写信!输出字符串是否被Ok()包裹在铁锈中,rust,output,Rust,Output,当尝试读取一个文件并将其写入另一个文件时,在使用write!时,每一行都被包装在Ok()中!。我一直无法发现我做错了什么,希望有人会有想法 我已经能够将这个问题与{:#?}有关的东西隔离开来 如果我将regulat文本放在“”中,它会很好地打印,并且超出Ok()。还有其他人见过这个吗 谢谢 使用std::fs::File; 使用std::io::{BufReader,BufRead}; 使用std::io::{Write,Error}; fn main()->结果{ 让ofile=File::o

当尝试读取一个文件并将其写入另一个文件时,在使用write!时,每一行都被包装在Ok()中!。我一直无法发现我做错了什么,希望有人会有想法

我已经能够将这个问题与{:#?}有关的东西隔离开来

如果我将regulat文本放在“”中,它会很好地打印,并且超出Ok()。还有其他人见过这个吗

谢谢

使用std::fs::File;
使用std::io::{BufReader,BufRead};
使用std::io::{Write,Error};
fn main()->结果{
让ofile=File::open(“test.xml”)?;
让mut new_file=file::create(“output.xml”)?;
让输入=BufReader::new(ofile);
对于input.lines()中的行{
写入!(新的_文件,“{:#?}”,行)?;
}
好(())
}
输入


AV
测试员
测试描述
合成输出

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>"
)
修正: 根据下面的回复,我更改了文字!并修复了该问题

写!(新的_文件,“{}\n”,行?)?;
BufReader
上调用
.lines()
将为您提供一个,其关联的
-类型为
std::io::Result
。也就是说,在对
.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)?;
}
让线:…=行
将导致编译器引发错误,因为行是结果,无法分配给固定为其他类型的变量;现在您知道
实际上是
结果
,而不是
字符串

BufReader
上调用
.lines()
会给您一个,其关联的
-类型是
std::io::Result
。也就是说,在对
.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)?;
}

让线:…=行
将导致编译器引发错误,因为行是结果,无法分配给固定为其他类型的变量;现在您知道
实际上是
结果
而不是
字符串

如果我没有弄错的话,
“{:#?}”
用于调试输出。因此,如果将
包装在
Ok(…)
中,它将像在您的帖子中一样打印出来。你应该打开行以获得实际的字符串。是什么让你认为你需要为此编写
write
宏?Peter Varo-我正在扩展rust cookbook ForceBru-Aha上的一个示例…这似乎解决了这个问题。找不到任何关于仅将其用作调试功能的信息…很高兴知道。如果我没弄错的话,谢谢,
“{:#?}”
用于调试输出。因此,如果将
包装在
Ok(…)
中,它将像在您的帖子中一样打印出来。你应该打开行以获得实际的字符串。是什么让你认为你需要为此编写
write
宏?Peter Varo-我正在扩展rust cookbook ForceBru-Aha上的一个示例…这似乎解决了这个问题。找不到任何关于仅将其用作调试功能的信息…很高兴知道。非常感谢。