rdbuf来重定向流 在SF的的collect.cpp中的collect函数中,使用了rdbuf来将标准输出重定向到日志文件。
// 重定向日志输出
ofstream file((LOG_PATH + "collect/" + fileName + ".log").c_str());
streambuf* buffer = cout.rdbuf(); //oldbuffer,STDOUT的缓冲区
cout.rdbuf(file.rdbuf());
// 恢复输出的重定向
cout.rdbuf(buffer); //重新载入STDOUT的缓冲区
下面是CPP Reference上的解释:
streambuf* rdbuf ( ) const;streambuf* rdbuf ( streambuf* sb );
Get/set the associated stream buffer
The first syntax returns the stream buffer object associated with the stream.
The second syntax associates the stream with sb and returns the stream buffer object previously associated with the stream. In this case, the buffer's control state is set to goodbit as if a call to member clear().
Parameters
sb
A pointer to the stream buffer object to associate the stream with.
Return Value
A pointer to the stream buffer object associated with the stream before the call
另外在CSDN上面以为老兄的帖子中,还绝伦一个例子,并提出了两个需要注意的地方,我感觉比较重要,就贴过来了。
#include
#include
int main()
{
std::ofstream log("foo.log");
std::streambuf *oldbuf = std::cout.rdbuf(log.rdbuf());
std::cout << "输出到标准输出,但实际输出到了foo.log文件中\n";
log << "输出到文件,虽然将cout重定向到了log,但不影响log本身的使用\n";
// 恢复流缓冲区
std::cout.rdbuf(oldbuf);
}
注意:
1.cout可以调用rdbuf来替换缓冲区,但log不能通过调用rdbuf来替换缓冲区。因为ofstream的rdbuf并没有同样的功能。
2.对流的重定向,只是作用在一个代码块内{},出了这个{},就恢复为原来的了,但是对在这个代码块内调用的函数,重定向也会生效。
basic_streambuf<charT,traits> * rdbuf ( basic_streambuf<charT,traits> sb );
分享到:
相关推荐
`basic_filebuf, traits>* rdbuf()`返回与`ifstream`关联的`filebuf`对象,可以用于更底层的文件操作。 #### 6. `ifstream::operator =` `ifstream& operator=(const ifstream&)`拷贝赋值操作符,通常用于复制文件...
代码如下: #include #include<fstream> //必要头文件 ... cin.rdbuf(in.rdbuf()); //将输入信息从控制台转向txt文件 for(int i=0;i;j>>a[i][j]; //输入到数组中的数据是从txt文件中读取到的,不用再在控制
cin.rdbuf(fin.rdbuf()); // assign file's streambuf to cin // ... cin will read from file cin.rdbuf(backup); // restore cin's original streambuf ``` 最后,我们使用了 `cin.rdbuf(backup)` 把 `cin` 又...
printf("old mem[%d]:%c\n", i, *(rdbuf + i)); } lseek(fd, 5, 0); write(fd, wrbuf, 10); lseek(fd, 0, 0); // move f_ops to the front read(fd, rdbuf, 10); for(i = 0; i ; i++) { printf("new mem[%...
`这行代码应该被注释掉或删除,而`_I.rdbuf()->sbumpc();`则需要添加进来。`sbumpc()`函数用于从输入流中读取并丢弃下一个字符,这样就可以避免额外字符的问题了。 3. **注意事项**:由于修改的是系统级别的头文件...
stream.next_in = (Bytef*)input.rdbuf()->pubbuf(); stream.avail_in = (uInt)input.rdbuf()->in_avail(); do { if (!stream.avail_out) { output.write((char*)stream.next_out, stream.total_out); stream....
std::streambuf* oldCout = std::cout.rdbuf(out.rdbuf()); myClass.sayHello(); std::cout.rdbuf(oldCout); ASSERT_EQ(out.str(), "Hello from MyClass!\n"); } ``` 构建和运行项目时,首先需要确保已经安装了...
STM32F40x微控制器上进行内部FLASH的读写操作: 1.设置扇区地址 (MY_FLASH_SetSectorAddrs): 功能:设置特定扇区的起始地址。 参数: sector:要设置的扇区号。...rdBuf:指向存放读取数据的缓冲区。
接着,使用`rdbuf()`方法将源文件的内容写入到目标文件。最后,关闭两个文件流。 接下来,我们讨论文件的删除。在VC++中,可以使用`remove`函数,它来自C标准库`<cstdio>`: ```cpp #include int main() { if ...
streambuf* pOld = cout.rdbuf(fout.rdbuf()); // ... cout.rdbuf(pOld); ``` #### 文件输出流成员函数 文件输出流提供了多种成员函数,包括但不限于: - **`open`**: 打开一个文件,使流对象与文件建立联系。 - ...
这里,我们使用了`std::ifstream`和`std::ofstream`来分别处理读取和写入操作,`rdbuf()`方法则用于读取源文件的全部内容并写入目标文件。 除了基本的逐字节复制,有时我们还需要考虑一些特殊情况,例如错误处理、...
这篇关于“将std::clog重定向到测试框架输出”的主题将深入探讨如何实现这一目标,尤其是在Windows环境下使用VS2015或Visual Studio系列IDE时。 首先,我们需要理解`std::streambuf`的角色。`std::streambuf`是I/O...
然后,使用`rdbuf()`方法读取源文件的内容,并将其写入到目标文件中。最后,确保所有文件流都被正确关闭。 “Maincopy.cpp”可能包含以下代码,用于调用`copyFile`函数并处理用户输入: ```cpp #include #include...
outfile << infile1.rdbuf(); // 将源文件1的内容写入目标文件 infile1.close(); infile1.open(source2); if (!infile1.is_open()) { std::cerr 无法打开源文件2!" ; return 1; } outfile << infile1.rdbuf...
std::streambuf *prevStreamBuf = std::cout.rdbuf(&output); myClass.sayHello(); REQUIRE(output == "Hello from MyClass!\n"); std::cout.rdbuf(prevStreamBuf); } ``` 构建和运行C++项目的步骤通常如下: ...
然后,使用`rdbuf()`方法将源文件的内容直接写入目标文件。 2. **Windows API方法**: 对于更底层的操作,可以使用Windows API中的`CreateFile`、`ReadFile`和`WriteFile`函数。这些函数提供更细粒度的控制,如...
在上面的代码中,我们首先打开源文件和目标文件,然后使用 rdbuf() 函数将源文件的内容复制到目标文件中。 二、文件的删除 文件的删除是指删除一个已经存在的文件。使用 C++ 编程可以通过使用 DeleteFile 函数来...
std::streambuf* oldbuf = std::cout.rdbuf(log.rdbuf()); // 现在,cout的输出将被重定向到test2.txt std::cout 语言输出重定向测试" ; // 恢复原来的streambuf,确保不会影响其他部分的输出 std::cout....
`rdbuf()`方法用于读取源文件的全部内容并将其写入目标文件。这种方法简单直观,适用于小文件,但对大文件可能效率较低。 另一种常见的方式是使用Windows API函数,如`CopyFile`或`CopyFileEx`。这些函数在处理大...
在这个例子中,我们首先使用`rdbuf`将文件内容读入`stringstream`,然后转换为`std::string`以便进行查找和替换。`find`函数返回旧字符串的位置,`replace`函数用于替换找到的字符串。最后,我们将更新后的字符串...