C ++ Чтение из файла в вектор

Я пытаюсь преобразовать программу поиска телефона с поточной строкой в ​​потоковый файл … Я что-то упустил, но я застрял … Какие члены я могу использовать в процессе 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;
}

2

Решение

Во-первых, вы не хотите 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* в качестве аргумента, и вы предоставляете пункт назначения
тип.

4

Другие решения

Вы никогда не связываете файл с 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 предназначен для открытия и записи файлов. В программе много синтаксических и логических ошибок, о которых я хотел бы прочитать подробнее Вот.

0

Похоже, вам не нужно использовать ofstreams для внутренних частей этой функции. На самом деле вам не нужно использовать потоки вообще, 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;
}
0
По вопросам рекламы [email protected]