2013-07-31 3 views
3

В настоящее время я пытаюсь скопировать вектор в новый текстовый файл после внесения необходимых изменений в вектор. Я могу построить проект отлично, но он дает мне странные ошибки, которые я не понимаю. Может ли кто-нибудь помочь мне в этом?Скопируйте векторную структуру в файл с помощью ostream_iterator и скопируйте

Моя структура

class AccDetails { 
public: 
    string username; 
    string name; 
    string topicid; 
    string testid; 
}; 

Код, который дает мне ошибки

vector<AccDetails>accInfo; 
ofstream temp ("temp.txt"); 
ostream_iterator<AccDetails>temp_itr(temp,"\n"); 
copy(accInfo.begin(),accInfo.end(),temp_itr); 

Там целый кусок строк ошибок, но я думаю, что это должно быть важно 2 линии: enter image description here

ответ

3

Вам необходимо перезагрузить operator<< для AccDetails. Это то, что ostream_iterator называет внутренним.

Нечто подобное:

std::ostream& operator<<(std::ostream& stream, const AccDetails& obj) 
{ 
    // insert objects fields in the stream one by one along with some 
    // description and formatting: 

    stream << "User Name: " << obj.username << '\n' 
      << "Real Name: " << obj.name << '\n' 
      << obj.topicid << ' ' << obj.testid << '\n'; 

    return stream; 
} 

Оператор принимает поток он вставляет, чтобы в качестве первого параметра и постоянная ссылки на объект он потоковый как второй (это позволяет передаче временной AccDetails, тоже). Теперь вы можете сказать:

AccDetails acc; 
std::cout << acc; 

Если оператору потребуется доступ к закрытым полям AccDetail «s, Вы должны были бы объявить как friend.

Если вы новичок в перегрузке оператора, я предлагаю вам прочитать this SO thread.

Надеюсь, что это поможет.

+0

@JoelSeah Я редактировал ответ. – jrok

+0

Спасибо. Теперь я понимаю ^^ –

+0

@jrok компилируется? – P0W

2

Может иметь это после перегрузки, как Джрки сказали:

class AccDetails 
{ 

    std::string username; 
    std::string name; 
    std::string topicid; 
    std::string testid; 

    friend std::ostream& operator<<(std::ostream&, const AccDetails&); 
    friend std::istream& operator>>(std::istream& is, AccDetails&); 
}; 

std::ostream& operator<<(std::ostream& os, const AccDetails& acc) 
{ 
    os << "User Name: " << acc.username << std::endl 
      << "Name: " << acc.name << std::endl 
      << acc.topicid << ' ' << acc.testid << std::endl; 
    return os; 
} 

std::istream& operator>>(std::istream& is, AccDetails& acc) 
{ 
    is >> acc.username >>acc.name >> acc.topicid >> acc.testid ; 
    return is; 
} 


int main() 
{ 

std::vector<AccDetails>accInfo; 

std::copy(std::istream_iterator<AccDetails>(std::cin), 
    std::istream_iterator<AccDetails>(),std::back_inserter(accInfo)); 

std::ofstream temp("temp.txt",std::ios::out); 
std::ostream_iterator<AccDetails>temp_itr(temp,"\n"); 
std::copy(accInfo.begin(),accInfo.end(),temp_itr); 

} 
+0

Обратите внимание, что в OP-коде поля 'AccDetails' являются общедоступными, поэтому нет необходимости, чтобы операторы потока были друзьями. – juanchopanza

+0

@juanchopanza ouh да, спасибо, в любом случае ответ выше jrok уже принят :) – P0W