2013-11-18 2 views
1

Я попытался записать векторный контент в файл. Для этого я написал кусок кода, как:Запись содержимого вектора в файл C++

int main() 
{ 
    ofstream outputfile("test.txt"); 
    vector<int>temp; 
    temp.push_back(1); 
    temp.push_back(2); 
    temp.push_back(3); 
    for(int i=0;i<temp.size();i++) 
     outputfile<<temp[i]<<"\n"; 
} 

Когда я пишу это, я могу сделать Ис, что я хотел. содержание файла:

Однако, когда я хочу написать свой вектор в файл от обратного (как показано ниже) .I получить nothing.Just пустого file.Is есть кто-нибудь, чтобы помочь меня ? Заранее спасибо.

for(int i=temp.size()-1;i>=0;i--) 
    outputfile<<temp[i]<<"\n"; 
+0

Вы начинаете один за концом 'vector'. – BoBTFish

+0

@BoBTFish Извините, я исправлю эту ошибку. Это было в нужном месте в моем реальном коде. Итак, проблема не в том, что – caesar

+5

[работает для меня] (http://ideone.com/K0jnYI). Если ваш код действительно дает вам пустой файл (как только он покраснел и/или закрыт), проблема должна быть в том, что вы не показывали. – Angew

ответ

7

Вы можете использовать

std::copy(temp.rbegin(), temp.rend(), 
      std::ostream_iterator<int>(outputfile, "\n")); 

И этот код:

for(int i=temp.size()-1;i>=0;i--) 
    outputfile<<temp[i]<<"\n"; 

прекрасно работает на моих окнах с VS12.

+0

спасибо, что указали @Angew – deeiip

+0

Неужели люди находят это более понятным, чем простой цикл? В любом случае, на самом деле это не затрагивает вопрос * почему * его цикл for не работает, потому что он должен. –

+3

@BenjaminLindley Как только вы привыкли к этому, да (по крайней мере, я знаю). Потому что вам не нужно смотреть и убеждаться, что цикл делает то, что кажется. – Angew

4

Вы можете сделать все это в 1 строку:

std::copy(temp.rbegin(), temp.rend(), std::ostream_iterator<int>(outputFile, "\n")); 
+0

благодарит за ответ. Поскольку в моей реальной проблеме размер моего вектора будет до 10000, а эффективность важна, будет ли процесс копирования вызвать проблему? – caesar

+3

@caesar Больше, чем что-либо еще. Большая часть времени, вероятно, будет 1) самой ИО, затем 2) преобразование в текст. В остальном копия будет делать то, что вы делаете в цикле. –

4

использовать обратный итератор:

for (std::vector<int>::reverse_iterator it = myvector.rbegin(); it != myvector.rend(); ++it) 

или в коде, начать цикл из size() - 1:

for(int i=temp.size()-1;i>=0;i--) 

вместо

for(int i=temp.size();i>=0;i--) 
+0

Я думаю, что вы имели в виду обратный_ристатор, с rbegin() и rend() –

+0

ups, да режим автопилота на извините ... – rmp

Смежные вопросы