C ++ ofstream动态文件名和内容

时间:2019-02-21 20:08:15

标签: c++ file fstream naming ofstream

尝试使用fstream在以下情况下编写动态文件名和内容:

ofstream file;
    file.open("./tmp/test.txt");
    //file.open("./tmp/%s.txt.txt", this->tinfo.first_name);    //nope file.open->FUBAR
    //file.open("./tmp/" + this->tinfo.first_name + ".txt");    //nope this->FUBAR
    //file.write( "%s\n", this->tinfo.first_name);              //nope this->FUBAR
    file << "%s\n", this->tinfo.first_name;                     //nope %s->FUBAR
    //Me->FUBU
    file << "test\n";
    file << "test\n";
    file.close();

我很天真地假定printf(%d,this-> foo)约定将起作用,如果不是实际的文件名,则是内容。

似乎什么都没用,我想念什么?

以防万一,其中包括:

#include "stdafx.h"
//#include <stdio.h>    //redundant, as "stdafx.h" already includes it
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */

#include <iostream>
#include <fstream> 
#include <string> 

3 个答案:

答案 0 :(得分:1)

如果this->tinfo.first_namestd::string,则可以将所有内容附加到一个string中。

std::string temp = "./tmp/" + this->tinfo.first_name + ".txt";
file.open(temp);

如果没有,则用string构建一个std::stringstream

std::ostringstream temp;
temp << "./tmp/" << this->tinfo.first_name << ".txt";
file.open(temp.str());

应处理%s将使用的任何数据类型。

Documentation for std::ostringstream

注意:C ++ 11中添加了可以消耗open的文件std::string。如果要编译到较旧的标准,则需要

file.open(temp.c_str());

答案 1 :(得分:0)

在这种情况下,您不需要%s,ofstream将隐式理解this->tinfo.first_name。因此,请替换此行

file << "%s\n", this->tinfo.first_name;                     //nope %s->FUBAR

作者

file << this->tinfo.first_name << "\n";                     //nope %s->FUBAR

答案 2 :(得分:0)

我不明白为什么要在fstream中使用printf语法。我只是建议您像使用ofstream一样使用cout。 E.X: file << this->tinfo.first_name << '\n';