Я пытаюсь преобразовать программу поиска телефона с поточной строкой в потоковый файл … Я что-то упустил, но я застрял … Какие члены я могу использовать в процессе 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;
}
Во-первых, вы не хотите ofstream
, за исключением того, что вы открываете
файл (создание экземпляра). Интерфейс выходного потока
определяется std::ostream
; std::ofstream
вытекает из этого, как и
std::ostringstream
(выход может стать 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*
в качестве аргумента, и вы предоставляете пункт назначения
тип.
Вы никогда не связываете файл с 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 предназначен для открытия и записи файлов. В программе много синтаксических и логических ошибок, о которых я хотел бы прочитать подробнее Вот.
Похоже, вам не нужно использовать ofstream
s для внутренних частей этой функции. На самом деле вам не нужно использовать потоки вообще, 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;
}