我想在C ++中使用两个指向同一文件的指针。
#include <fstream>
int main()
{
double a;
std::ofstream fout1( "out.txt");
fout1 << "CASE A:"<<std::endl;
std::ofstream fout2( "out.txt", std::fstream::app);
fout2 << "CASE B:" <<std::endl;
for (int i=0; i < 3; i++){
a = i*i;
fout1 << a << std::endl;
fout2 << 10+a <<std::endl;
}
return 0;
}
这段代码告诉我:
CASE A:
0
1
4
11
14
但我想:
CASE A:
0
1
4
CASE B:
10
11
14
在我的实际代码变量中,“a”是一个巨大的计算,所以做一个双精度就不是一个好的解决方案。我想到了两个解决方案:
我认为2是最好的,所以如何使用两个指向同一个文件的指针?
答案 0 :(得分:0)
使用两个流写入同一个文件将变成一场噩梦,您必须在一个流更改的位置刷新和重新同步,以确保另一个流看到这些更改。更好地消除这个想法并使用单个输出来解决问题。
如果你想坚持这个想法,每次你要切换到另一个流电话:
firstStrm.flush();
secondStrm.tie(firstStrm);
secondStrm.seekp(firstStrm.tellp())
其中firstStrm是您完成编写的流,secondStrm是您要开始编写的流。
答案 1 :(得分:0)
你遇到的根本问题是写入 <input type='file' id='testfile' style='display:none' />
<button onclick='document.getElementById("testfile").click()'>Upload</button>
<script>
var testfile = document.getElementById('testfile')
testfile.onclick = focus();
function focus()
{
document.body.onfocus = invoke();
}
function invoke()
{
if(testfile.value.length)
{
alert('has file');
}
else {alert('empty')}
</script>
clobber以前写入fout1
。由于您不知道文件中的哪个位置需要开始写出“CASE B”数据,因此必须等到所有“CASE A”数据都写入“CASE B”开始之前。
您可以将CASE B数据写入另一个(临时)文件,然后在完成CASE A(并删除临时文件)时复制该数据,累积您要写入字符串缓冲区的数据然后写出来。
或者做出选择1,即将所有fout2
值保存到a
中,然后在最后处理这些值。这可能是最快的方法,虽然如果你有大量的数据内存可能是一个问题,你必须采用两种文件方法。
答案 2 :(得分:0)
如果你想要两个指针到同一个文件,那么创建它们:
std::ofstream fout("out.txt");
std::ofstream * fout1(&fout);
std::ofstream * fout2(&fout);
具有多个指向输出流的指针的问题是,您可以按随机顺序输出数据,具体取决于执行情况。多线程或多个任务会更糟糕。
另一种解决方案是通过引用将输出流传递给构造函数或函数。一个类可以拥有流的副本:
class Hello
{
public:
Hello(std::ostream& output)
: m_output(output)
{ }
private:
std::ostream& m_output;
};