2015-03-23 6 views
1

У меня есть текстовый файл, в котором я храню информацию, которая расположена в таком порядке:C++ редактировать TXT файл с помощью элемента

Name somename 
Age someAge 
Address someAddress 
... 

я смотрю эту информацию элементами, как это:

if (myfile.is_open()) 
{ 
    while (myfile >> element1) 
    { 
     myfile >> element2; 

     if (element1 == "Name") 
      _name = element2; //element2 is someName in .txt file 

     if (element1 == "Age") 
      _age = element2; //element2 is someAge in .txt file 
     ... 
    } 
    myfile.close(); 
} 

и т. д. ...

Возможно ли отредактировать txt-файл таким образом, используя поток?

+0

Вы хотите отредактировать существующий текстовый файл или записать данные в новый текстовый файл? Рассматривали ли вы использование базы данных? –

+0

Отредактируйте существующий файл, простите меня за не упоминание. Мне, вероятно, придется использовать, я думал об этом, но я вижу, могу ли я обойтись без базы данных, так как информация не очень большая. –

ответ

2

«Возможно также отредактировать txt-файл, используя ofstream

Да, это возможно. Просто не сразу манипулируйте содержимым файла (как вы могли бы подумать).

  1. Читает в файле с помощью std::ifstream построчно в std::vector<std::string> переменной
  2. Вы манипулировать эти линии с использованием различных std::string функций по мере необходимости
  3. Вы открываете тот же файл, как std::ofstream (используйте std::iosbase::trunc флага открытие)
  4. Вы пишете все ваши std::vector<std::string> переменных в выходной файл

Как @Jerry Coffin mentioned, вы можете подумать о создании резервной копии управляемого файла на 1-м месте. Если вы это сделаете, вы также можете воспользоваться возможностью манипулирования одиночными записями, без необходимости читать в полном файле (может привести к проблемам с памятью, если это действительно большой).

+0

Мне кажется хорошим решением. Я попробую, спасибо. –

+2

@ NunoBarão Вы также можете рассмотреть возможность использования kinda 'struct Person;' для структурирования информации, прочитанной более кратким образом. Вот несколько указателей, как правильно это сделать: [Почему чтение строковых записей полей из std :: istream завершается неудачно, и как я могу это исправить?] (Http://stackoverflow.com/questions/23047052/why-does -reading-а-STRUCT-запись-поля-из-stdistream-отказоустойчивость и-как-может-я-р). –

+2

Просто отметьте, что (как минимум, как указано) у этого есть «опасная зона». Если (например) машина теряет мощность после обрезания потока, но перед записью нового содержимого вы можете получить пустой или поврежденный файл. Если это серьезная проблема, вы можете скопировать файл в резервную копию, затем обрезать и записать, и когда это завершает удаление резервной копии. Если файл резервной копии существует при запуске программы, возникла проблема, и она может реагировать соответствующим образом. –

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