2015-01-23 3 views
0

Я просто интересно, потому что у меня есть текстовый файл, содержащий STATUS: USERID: ПАРОЛЬ в accounts.txtЗаменить строку в текстовый файл C++

примера будет выглядеть следующим образом:

OPEN: боб: askmehere:

OPEN: джон: askmethere:

LOC K: грабят: robmypurse:

У меня есть пользовательский ввод в мой основной как таковой пользователь может войти на форум 3x еще статус изменится с открытого БЛОКИРОВКА

пример после 3 попыток из Джона

перед:

О.П. EN: боб: askmehere:

OPEN: джон: askmethere:

LOCK: грабят: robmypurse:

после:

OPEN: боб: askmehere:

L OCK: джон: askmethere:

LOCK: грабят: robmypurse:

то, что я сделал это:

void lockUser(Accounts& in){ 
// Accounts class consist 3 attributes (string userid, string pass, status) 

ofstream oFile; 
fstream iFile; 
string openFile="accounts.txt"; 
string status, userid, garbage; 
Accounts toupdate; 

oFile.open(openFile); 
iFile.open(openFile); 

    while(!iFile.eof()){ 

     getline(iFile, status, ':'); 
     getline(iFile, userid, ':'); 
     getline(iFile, garbage, '\n'); 


     if(userid == in.getUserId()){ 

      toupdate.setUserId(in.getuserId()); 
      toupdate.setPassword(in.getPassword()); 
      toupdate.setStatus("LOCK"); 
      break; 
    } 

    //here i should update the account.txt how do i do that? 
    ofile.open(openFile); 

    ofile<<toupdate.getStatus()<<":"<<toupdate.getUserId()":"<<toupdate.getPassword()<<":"<<endl; 
} 
+0

Либо прочитать весь файл, и заменить соответствующие слова в памяти, или поместить курсор в файл в нужном месте, и замените там слово. –

+1

Не делайте 'while (! IFile.eof())', потому что, если вы не будете осторожны, он не будет работать так, как вы ожидаете. Причина в том, что флаг 'eofbit' не установлен до * после *, который вы пытаетесь прочитать из-за файла, что приводит к тому, что цикл повторяется один раз для многих. Вместо этого, например, 'while (std :: getline (...))' –

ответ

0

Используйте ReadLine и найдите строку вы хотите заменить, и использовать замену, чтобы заменить вещь вы хотите заменить. Например, пишут:

string Example = "Text to find"; 
openFile="C:\\accounts.txt"; // the path of the file 
ReadFile(openFile, Example); 

ИЛИ

#include <fstream> 
#include <iostream> 
#include <string> 

int main() { 

ifstream openFile; 
string ExampleText = BOB; 
openFile("accounts.txt"); 
openFile >> ExampleText; 
openFile.replace(Example, "Hello"); 

}

+0

Я получил это спасибо! :) – isme

8

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

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

Ваша реализация ошибочна, потому что вы открываете выходной файл (который совпадает с входным файлом) внутри цикла.Первая проблема заключается в том, что операционная система может не разрешить вам открывать файл для записи, если вы уже открыли его для чтения, и, поскольку вы не проверяете отказ от открытия файлов, об этом вы не узнаете. Другая проблема заключается в том, если операционная система позволяет это, тогда ваш вызов open усекает существующий файл, в результате чего вы потеряете все, кроме самой первой строки.


Простой псевдо-иш код для объяснения

std::ifstream input_file("your_file"); 
std::vector<std::string> lines; 
std::string input; 
while (std::getline(input_file, input)) 
    lines.push_back(input); 

for (auto& line : lines) 
{ 
    if (line_needs_to_be_modified(line)) 
     modify_line_as_needed(line); 
} 

input_file.close(); 

std::ofstream output_file("your_file"); 
for (auto const& line : lines) 
    output_file << line << '\n'; 
+0

, так как же я это делаю тогда? @Joachim Pileborg – isme

+0

@isme Обновлен мой ответ с помощью простого псевдоисшего кода. –

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