C++ Поиск строки из текстового файла и обновление/запись строки

У меня есть файл банковского счета, который программа должна прочитать. На данный момент эта функция работает с использованием ifstream. Но я хочу, чтобы программа читала 6-ю строку текстового файла (которая имеет значение «баланс»), а затем обновляла ее по мере необходимости (удаляла и заменяла новым значением).

Я использовал цикл for, чтобы найти обход по линиям. Но как мне обновить его при необходимости? (Снятие и ввод денег обновляют баланс)

Это код, который у меня есть на данный момент:

ifstream file;
string line;
file.open ("accounts.txt", ios::in); 

for(int i = 0; i < 6; ++i)    //6 being the 6th line
      {
         getline(file, line);
      }

Что будет дальше, ребята? Спасибо :)


person PJ_Boy    schedule 25.05.2013    source источник
comment
Насколько большим будет ваш файл?   -  person itsols    schedule 25.05.2013
comment
Это небольшой текстовый файл, около 10 строк.   -  person PJ_Boy    schedule 25.05.2013


Ответы (1)


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

Например, вы можете прочитать это в arry следующим образом:

//assuming you've defined the array A
for(int i = 0; i < 6; i++)    //NOTE: I've changed the loop counter i
      {
         getline(file, line);
         A[i] = line;
         cout << A[i] < "\n"; //This is the NEW LINE I wanted you to put
         //If the ABOVE line gives nothing, you ought to check your TXT file.
      }
//Change line 6
A[5] = "555.00";
//Now reopen the file to write
ofstream Account ("accounts.txt");
if (Account.is_open())
  {
    for(i=0;i<6;i++)
       {//NOTE THAT I HAVE INCLUDED BRACES HERE in case you're missing something.
        Account << A[i] << "\n"; //Loop through the array and write to file
       }
    Account.close();
  }

Я не проверял это, но я думаю, что это нормально. Дополнительный код: если вы добавите следующий фрагмент кода в конец основного кода, вы должны увидеть содержимое массива. И если это ничего не показывает, это явно означает, что ваш файл ПУСТ.

for(int i = 0; i < 6; i++)
   {
    cout << A[i] < " This is a row with data\n";
   }

Примечание. Хотя я хотел бы помочь вам в РАЗЪЯСНЕНИИ вопросов на этом форуме, я думаю, что этот вопрос выходит за рамки этого форума. Возможно, вам нужно потратить некоторое время на изучение искусства циклов и других структур :)

person itsols    schedule 25.05.2013
comment
ПРОБЛЕМА: Он стирает все значения в A[1] до 6 и записывает только значение 6. Другие пустые - person PJ_Boy; 25.05.2013
comment
Это хорошая концепция, если только она сохраняет существующие значения A[1] и остальных без стирания? - person PJ_Boy; 25.05.2013
comment
@PJ_Boy Вероятно, ошибка в вашем коде. Можете ли вы показать мне код во втором цикле for? Просто вставьте его в это место для комментариев - person itsols; 25.05.2013
comment
for(int i = 0; i ‹ 6; ++i) // 6 — это 6-я строка { getline(file, line); А[i] = строка; } А[5] = строка; } ofstream Аккаунт (accounts.txt); if (Account.is_open()) { for(int j=0;j‹6;j++) Account ‹‹ A[j] ‹‹ \n; //Проходим по массиву и записываем в файл Account.close(); } - person PJ_Boy; 25.05.2013
comment
хрень, все перемешалось в комментах - person PJ_Boy; 25.05.2013
comment
хорошо, первый шаг, откройте ваш текстовый файл с помощью любого редактора и проверьте, действительно ли в нем есть данные в первых 6 строках. Второй шаг: в ПЕРВОМ цикле, где мы сохраняем текст в массиве, вскоре после того, как мы назначаем текст массиву, выводим элемент. Это покажет нам, есть ли информация в нем или нет. Тогда дайте мне знать... - person itsols; 25.05.2013
comment
Еще одно: не используйте ++i в цикле. Скорее измените его на i++ - person itsols; 25.05.2013
comment
Я обновил ваш код, проверьте его и дайте мне знать, правильный ли код дисплея? сэр, ничего не показывает - person PJ_Boy; 25.05.2013