C++ 流式输出以保存内容

C++ 流式输出以保存内容,c++,C++,我想>str; 当然你可以一个字符一个字符地流。那么它将是一个真正的二进制副本 ofstream of("file.txt"); while(1) { char c; cin>>c; of<<c; } (“file.txt”)流的; 而(1) { 字符c; cin>>c; 使用格式化的提取操作符进行流式处理是一个糟糕的选择。具体来说,它将消耗所有的空白 如果是我,我会使用std::getline或istream::rdbuf进行复制: // Co

我想>str;
当然你可以一个字符一个字符地流。那么它将是一个真正的二进制副本

ofstream of("file.txt");
while(1)
{
   char c;
   cin>>c;
   of<<c;   
}
(“file.txt”)流的
;
而(1)
{
字符c;
cin>>c;

使用格式化的提取操作符进行流式处理是一个糟糕的选择。具体来说,它将消耗所有的空白

如果是我,我会使用
std::getline
istream::rdbuf
进行复制:

// Copy entire standard input stream to named file in one go
#include <iostream>
#include <fstream>

int main (int argc, char **argv) {
  std::ofstream(argv[1]) << std::cin.rdbuf();
}
std::getline

// Copy standard input to named file, one line at a time.
#include <iostream>
#include <fstream>

int main (int argc, char **argv) {
  std::string s;
  std::ofstream of(argv[1]);
  while(std::getline(std::cin, s)) {
    of << s << "\n";
  }
}

先发几点:

(“file.txt”)流的

如果您想查看日文、中文或韩文字符,您不应该在此处使用流的
。您需要一个写宽字符的流:a
std::wofstream
。您还将为该流赋予区域设置。有关详细信息,请参阅

另一点:您显然有一个
使用名称空间std;
。您可以在Stack Overflow中找到许多问题,表明这是一个坏主意。键入额外的五个字符并不困难,它避免了来自标准库的名称污染您的名称空间的问题,并且使代码更清晰

while(1)

您的循环没有任何
break
语句来跳转循环,因此这加上
while(1)
意味着您的程序永远不会停止。它只会继续前进,前进,前进。您希望它在输入流中遇到错误或文件结束时停止(或应该停止)

更好的方法是使用一个构造,例如

while (std::getline (std::cin, s))

控制循环(除非您需要使用特殊的字符来获得宽字符)。

请澄清。您的意思是您键入了“非英语”吗输入控制台的字符?它们可能编码为UTF-8。将文件读回内存并在控制台上打印。如果控制台设置正确,您将看到按预期打印的非ASCII字符。@Martin和Oli,非常感谢,我将尝试您的建议。我指的是韩语、阿拉伯语等字符。谢谢Adi,这很好。我正在学习stream的基础知识,这很有帮助。@Dalton:这不是你想要的解决方案。它不起作用(试试看)。如果这被认为是错误的,请投反对票,或者留下评论解释原因。-1:这里有三个问题:(1)这
而(1)
。程序不会终止,也不会响应输入流中的EOF。(2)
cin>>c
。这会跳过输入文件中的空白。它不是真正的二进制副本。(3)OP要求能够处理宽字符。这不是。是的,对。我环顾四周,发现使用std::cin流不可能实现正确的二进制副本。至少使用流运算符是不可能的。read member方法可能会有所帮助。
while (std::getline (std::cin, s))