我有一个函数会覆盖现有文件的数据,但是这里没有正常工作是我的代码:
void printList(entry* my_node)
{
ofstream output;
output.open("output.txt");
std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
if(my_node == NULL) return;
else {
string x=my_node->forename;
output<<x<<endl;
output<<my_node->surname<<endl;
output<<my_node->email<<endl;
output<<my_node->number<<endl;
std::cout<<"forename: "<<my_node->forename<<std::endl;
std::cout<<"surname: "<<my_node->surname<<std::endl;
std::cout<<"email: "<<my_node->email<<std::endl;
std::cout<<"Phone Number: "<<my_node->number<<std::endl;
printList(my_node->next);
output.close();
}
}
当我这样做时,它清除文件并且不写任何内容...我还试图先清除文件然后写入文件
output.clear();
output.close();
output.open("output.txt",ios ::out|ios::app);
std::streambuf *coutbuf = std::cout.rdbuf();
//save old buf
///and then the rest but it didn't work as well
任何帮助请????
答案 0 :(得分:1)
您使用每个下一个值递归调用printList
,直到您到达列表的末尾,该列表调用printlist(NULL)
。然后输出文件最后一次被截断 。这就是文件为空的原因。
要将整个列表写入文件,请使用循环并在循环内部写入每个元素,例如:
while (my_node != NULL) {
output << my_node->forename << endl;
output << my_node->surname << endl;
output << my_node->email << endl;
output << my_node->number << endl;
/* ... */
my_node = my_node->next;
}
output.close();
答案 1 :(得分:0)
即使在printList
为空的情况下,您也会在每次到达my_node
时打开并覆盖新文件。如果这不是您的意图,那么移动
ofstream output;
output.open("output.txt");
进入if语句的主体。或者,如果您希望所有节点内容都在同一个文件中,请将其移出遍历。
另请注意ofstream
的构造函数接受参数,因此您可以编写
ofstream output("output.txt");