2012-07-03 4 views
0

Сохранение вектора строк на диск не работает должным образом. Я вижу, что этот файл создан, но с 0 байтами и без записей. Примечание: Я компилирую код C++ в ОС MAC на Xcode (v4.3.3).Сохранить вектор строки на диск не работает

Декларация вектора и строка:

vector<string>taskVector; 
string newTaskEntry; 

Это, как я добавить новые строки в массив, а программа работает:

taskVector.push_back(newTaskEntry); 

При выходе пользователя программы я делаю это:

 fstream file; 
     file.open("data.txt", ios::out | ios::trunc); 

     for (int i = 0; i > taskVector.size(); i++) { 
      file.write(taskVector[i].c_str(), taskVector[i].length()); 
      file.close(); 

Любая идея, почему я не вижу никаких записей? Во-вторых, можете ли вы дать мне подсказку, как читать данные, когда я могу сохранить содержимое на диск?

+7

Вы можете взять текст 'file.close()' из тела цикла. – kratenko

+0

СПАСИБО МУЖЧИН. Это была проблема. –

+2

Вместо итерации по индексу вы можете использовать итератор.См. ['Vector :: begin'] (http://www.cplusplus.com/reference/stl/vector/begin/) и [' vector :: end'] (http://www.cplusplus.com/reference/stl/vector/end /) для получения дополнительной информации. Итераторы не будут уязвимы для использования неправильного порядка ('>' вместо '<'). – outis

ответ

3

Первый (как @Nim упоминалось), вы сделали свой чек неправильно:

for (int i = 0; i > taskVector.size(); i++) { 

должен по

for (int i = 0; i < taskVector.size(); i++) { 

Второе: принимать близко из цикла:

for (int i = 0; i > taskVector.size(); i++) { 
    file.write(taskVector[i].c_str(), taskVector[i].length()); 
} 
file.close(); 

И про чтение их обратно: Прямо сейчас, y ou не сохраняет информацию, где заканчиваются ваши строки, или как долго они сохраняются. Без этого вам придется угадать, где строки и (и сколько они есть). Я бы рекомендовал одно из следующего:

Либо взять байт окончания, который указывает, когда строка заканчивается в вашем файле. '\0' была бы идеей. Но вы должны убедиться, что его нет в ваших строках, или вы не можете точно их перевести. При чтении назад, разделите на этом символе.

Другой способ - хранить информацию о длине строк перед строками. Вы можете сохранить unsigned int из 4 байтов перед сохранением строки. Затем, при чтении назад, вы сначала читаете 4 байтовую строку, затем читаете количество байт, которое указывает номер. Проблемы: вам нужно решить, как долго ваши строки могут быть максимальными (с 4 байтами информации о длине, это около 4,8 * 10^9 байт, в значительной степени). И вы можете проверить порядок байтов вашей системы (большой эндиан против маленького конца), если вы планируете использовать его на разных компьютерах.

+2

Я бы рекомендовал простой подход к тому, чтобы каждая строка была на собственной линии. Тогда читать легче с помощью 'std :: getline()' – Nim

+0

@nim. Я бы сказал, что на самом деле это специальная версия с байтом окончания. Но это легче читать, твой, прямо там, спасибо за дополнение. – kratenko

+0

Благодарим вас за разъяснение, оцените его. –

5

Вот ваша проблема:

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

Посмотрите на эту линию очень осторожно.

EDIT: как для вашего обновления, вот несколько советов:

  1. использование std::getline() читать построчно
  2. использования push_back() на векторе для вставки в вектор.
+1

О да, мне тоже не нравится пост-инкремент. Или вы имели в виду что-то еще? –

+1

'>' и '<', каков ваш выбор? –

+3

@ChristianRau, ты шутишь? Сегодня утром мой измеритель чувствительности юмора - недостаточно кофе .. – Nim