我正在尝试将字符串流式电话查找程序转换为文件流式传输..我遗漏了一些东西,但我卡住了...我可以在ofstream流程中使用哪些成员来使其正常工作?
ofstream& process (ofstream &os, vector<PersonInfo> people)
{
// for each entry in people
for (vector<PersonInfo>::const_iterator entry = people.begin();
entry != people.end(); ++entry) {
ofstream formatted, badNums; // objects created on each loop
// for each number
for (vector<string>::const_iterator nums = entry->phones.begin();
nums != entry->phones.end(); ++nums) {
if (!valid(*nums)) {
badNums << " " << *nums; // string in badNums
} else
// ``writes'' to formatted's string
formatted << " " << format(*nums);
}
if (badNums.empty()) // there were no bad numbers
os << entry->name << " " // print the name
<< formatted.str() << endl; // and reformatted numbers
else // otherwise, print the name and bad numbers
cerr << "input error: " << entry->name
<< " invalid number(s) " << badNums.str() << endl;
}
return os;
}
答案 0 :(得分:4)
首先,您不想要ofstream
,除非您正在打开这一点
文件(创建实例)。输出流接口是
由std::ostream
定义; std::ofstream
也是如此。std::ostringstream
{{3}}(输出可以成为std::string
),并且在大多数情况下
应用程序,由本地程序员编写的其他几个。在
你的情况(如果我能正确理解问题),你想要的是:
std::ostream& process( std::ostream& os,
std::vector<PersonInfo> const& people )
// Note the use of a const reference above. No point
// in copying the entire vector if you're not going to
// modify it.
{
for ( std::vector<PersonInfo>::const_iterator entry = people.begin();
entry != people.end();
++ entry ) {
std::ostringstream formatted;
std::ostringstream badNums;
// ...
if ( badNums.str().empty() ) {
os << ... << formatted.str() << std::endl;
} else {
os << ... << badNums.str() << std::endl;
}
}
return os;
}
请注意不同的类型:std::ostream
格式输出,独立
目的地类型。 std::ofstream
源自它,并提供
一个文件作为目的地。 std::ostringstream
源自它,和
提供std::string
作为目标类型。 std::ostream
以std::streambuf*
为参数,并提供目的地
类型。
答案 1 :(得分:0)
看起来您不需要将ofstream
用于此功能的内部部分。实际上你根本不需要使用流,std::string
会这样做:
ofstream& process (ofstream &os, vector<PersonInfo> people)
{
// for each entry in people
for (vector<PersonInfo>::const_iterator entry = people.begin();
entry != people.end(); ++entry) {
string formatted, badNums; // objects created on each loop
// for each number
for (vector<string>::const_iterator nums = entry->phones.begin();
nums != entry->phones.end(); ++nums) {
if (!valid(*nums)) {
badNums += " " + *nums; // string in badNums
} else
// ``writes'' to formatted's string
formatted += " " + format(*nums);
}
if (badNums.empty()) // there were no bad numbers
os << entry->name << " " // print the name
<< formatted << endl; // and reformatted numbers
else // otherwise, print the name and bad numbers
cerr << "input error: " << entry->name
<< " invalid number(s) " << badNums << endl;
}
return os;
}
答案 2 :(得分:0)
您永远不会将文件与ostream关联,因此编译器不知道如何处理您写入的数据。
ofstream& process (ofstream &os, vector<PersonInfo> people)
{
os.open("Data.txt"); //open file to be used
if(!os.is_open())
std::cerr << "Error opening file!\n";
//rest of code goes here
}
编辑:再次阅读你的程序后,我注意到你使用了ofstream错误。 Ofstream用于打开和编写FILES。该程序有很多语法和逻辑错误,我会更多地阅读here。