我正在尝试记录我的事件,所以我想使用ostringstream保存输出,然后将其发送到我在屏幕和文件fstream fileOut上打印输出的函数。它不会工作,它只是给我随机数字,似乎不会在同一个文件上输出所有新输出,但每次只创建一个新文件并删除之前的文件。我该怎么做?
打印发生的地方:
void Event::output(ostringstream* info) {
std::cout << info << std::endl;
fileOut << info << std::endl;
}
输出发生的地方:
ostringstream o;
if (time < SIM_TIME) {
if (status->tryAssemble(train)) {
Time ct;
ct.fromMinutes(time);
o << ct << " Train [" << train->getTrainNumber() << "] ";
Time t(0, DELAY_TIME);
o << "(ASSEMBLED) from " << train->getStart() << " " << train->getScheduledStartTime() <<
" (" << train->getStartTime() << ") to " << train->getDest() << " " << train->getScheduledDestTime() <<
" (" << train->getDestTime() << ") delay (" << train->getDelay() << ") speed=" << train->getScheduledSpeed() <<
" km/h is now assembled, arriving at the plateform at " << train->getStartTime() - t << endl << endl;
fileOut.open("testfile.txt", std::ios::out);
if (!fileOut.is_open())
exit(1); //could not open file
output(&o);
train->setStatus(ASSEMBLED);
time += ASSEMBLE_TIME;
Event *event = new ReadyEvent(simulation, status, time, train);
simulation->addEvent(event);
答案 0 :(得分:1)
它不会工作,它只是给我随机数
您正通过指针将ostringstream
传递给您的函数。没有operator<<
将ostringstream*
指针作为输入并打印其字符串内容。但是有一个operator<<
以void*
作为输入并打印指针所指向的内存地址。这就是&#34;随机数&#34;你看到了。可以将任何类型的指针分配给void*
指针。
您需要取消引用ostringstream*
指针才能访问实际的ostringstream
对象。尽管如此,仍然没有operator<<
作为输入ostringstream
。但是,ostringstream
有一个str()
方法可返回std::string
,并且operator<<
用于打印std::string
:
void Event::output(ostringstream* info) {
std::string s = info->str();
std::cout << s << std::endl;
fileOut << s << std::endl;
}
话虽如此,你应该通过const引用而不是指针传递ostringstream
,因为该函数不允许传入null ostringstream
,并且它不会修改{{ 1}}以任何方式:
ostringstream
似乎不会在同一个文件上输出所有新输出,而只是每次创建一个新文件并删除之前的文件。
这是因为您没有使用void Event::output(const ostringstream &info) {
std::string s = info.str();
std::cout << s << std::endl;
fileOut << s << std::endl;
}
...
output(o);
或app
标志 1 打开文件,因此每次都会创建一个新文件,丢弃任何内容现有文件。如果要添加到现有文件,则需要:
使用ate
标记&#34;在打开&#34;后立即寻找到流的末尾:
ate
使用fileOut.open("testfile.txt", std::ios::out | std::ios::ate);
标记来&#34;在每次写入之前寻找到流的末尾&#34;:
app
1:如果fileOut.open("testfile.txt", std::ios::out | std::ios::app);
是fileOut
,则无需明确指定std::ofstream
。