C++ 将管道作为日志旋转器连接到我的程序

C++ 将管道作为日志旋转器连接到我的程序,c++,linux,terminal,pipe,stdin,C++,Linux,Terminal,Pipe,Stdin,我正在尝试实现自己的日志旋转器(每当文件大小达到10MB时创建新的日志文件)。读取标准输入并将其写入文件的部分如下: fstream file("log.txt", ios::out | ios::app); while (std::cin >> lineInput) { file << lineInput; } 只需将所有文件名连接在一起,如下所示: LogRotatormain.oMakefile 而ls的输出为: LogRotator main.o Ma

我正在尝试实现自己的日志旋转器(每当文件大小达到10MB时创建新的日志文件)。读取标准输入并将其写入文件的部分如下:

fstream file("log.txt", ios::out | ios::app);
while (std::cin >> lineInput) {
    file << lineInput;
}
只需将所有文件名连接在一起,如下所示:

LogRotatormain.oMakefile
ls
的输出为:

LogRotator main.o Makefile

我的问题:如何让标准流媒体保留所有内容,包括制表符、换行符等?

多亏了Dieter Lück的提示,我找到了这样做的方法。因此必须使用无格式读取。以下工作很好:

fstream file("log.txt", ios::out | ios::app);
while (getline(cin,lineInput,'\n'))
{
    file << lineInput;
}
fstream文件(“log.txt”,ios::out | ios::app);
while(getline(cin,lineInput,'\n'))
{

文件您可能会忽略格式化的输入/输出,而使用读/写(和类似的)来代替“未格式化”的确切含义是什么?它的格式如此之高,完全不可移植,考虑到您使用的是纯STL,这是令人惊讶的。@Blindy该函数不做任何字符串处理,也不根据其内容判断输入(满足分隔符时除外,但分隔符也随文本一起传递)。它以读取的方式发送。其他处理方法,如流式传输到
std::cin
会多次修改输入。例如,它会将
\n
更改为新行。这就是我的理解。它肯定不会,流块复制是通过
ifstream::read
ofstream::write
完成的。两者都是
getline
operator@Blindy我不是这方面的专家,还在学习。但是这段代码很有效,看起来根本不像是在修改数据。我的日志很好!这怎么解释呢?@盲目地:当然是
getline
如果一个格式化的io函数,应该只用于文本,而不是二进制。但是它读取的是EXT一行一行不修改行中的文本……除了最终的字符集转换。因此这正是量子物理学家想要的。他不想在一行中更改日志文件,应该用原始IO函数明确处理什么内容。
fstream file("log.txt", ios::out | ios::app);
while (getline(cin,lineInput,'\n'))
{
    file << lineInput;
}