【问题标题】:Copying file with rdbuf and inconsitent reading from the file?使用 rdbuf 复制文件并且从文件中读取不一致?
【发布时间】:2015-08-31 15:16:27
【问题描述】:

比方说,我有几个数字的文件 input.txt

1 2
4 51
3 77

现在,我正在尝试执行此命令:

`string filename="input.txt";     
ifstream ifs;     
ifs.open(filename);      
ifs>>x>>y;       
fstream tmp("temp.txt",ios::out);      
tmp<< ifs.rdbuf();    `

现在文件 temp.txt 看起来像

(空白)
4 51
3 77

那么,这是因为我没有读到行尾吗? "ifs" ponter 只是移动了两个整数,剩下的行的结尾被留下了。 为什么在第一个文件中,我可以循环使用

ifs&gt;&gt;x&gt;&gt;y;

在第二个 (tmp) 中不是吗?另一方面,如果我手动创建带有空白空间的 temp.txt,上面的命令会立即起作用。为什么不一致?

谢谢。

【问题讨论】:

    标签: c++ fstream ifstream ostream


    【解决方案1】:

    因为ifs &gt;&gt; x &gt;&gt; y; 不读取第一行数字后的换行符。在这种特殊情况下,您可以通过添加 ifs.get() 或类似的方法来修复它,但在一般情况下 [e.g.如果文件是1 2 &lt;newline&gt;,文件中仍然会有一堆空格和一个换行符——只比没有get调用少一个,所以你必须读取输入文件并确定其中的内容文件。

    正如 Joachim 建议的那样,您可以使用 ignore 跳到下一个换行符,但同样,如果您有多个换行符,它也无济于事。

    【讨论】:

      【解决方案2】:

      输入操作符,当读取例如字符串和数字(​​整数和浮点),跳过前导空格。

      如果您想在读取前两个数字后删除尾随空格,只需 ignore 直到行尾。

      【讨论】:

      • 更重要的是,留下尾随空格... :)
      • 但是为什么我从文件 temp.txt 读取时无法得到它。我从上面的简单脚本中得到的。
      • 您的意思是“为什么ifs &gt;&gt; x &gt;&gt; y; 不读取换行符?因为这就是这些运算符的定义方式,它们在输入流中不是“有效”的第一个字符处停止(在这种情况下为“不是数字的一部分”) - 并将其留在输入流中以供下一个输入 - 如果它是另一个 ifs &gt;&gt; x &gt;&gt; y; 将跳过它,但 rdbuf 只会为您提供输入流中的所有内容,不管它是什么。
      • 对不起,但我现在很困惑。如果>>x>>y;如果我使用上面的脚本(使用 rdbuf())创建文件 temp.txt,则它不适用于文件。但是,如果我创建具有相同内容的 temp.txt,输入运算符将跳过前导空格并读取第一个数字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      相关资源
      最近更新 更多