2013-05-13 3 views
4

Я пытаюсь удалить строку из моего .txt-файла. Файл содержит всю информацию об учетной записи.C++ Удалить строку из файла .txt

Линия говорит «newAccount» и создается при создании учетной записи. Я использую это, чтобы загружать учебник при первом входе в систему. После учебного курса я хочу удалить эту строку, чтобы в следующем входе вы не получили учебник.

Heres фрагмент кода: (не работает)

void loginScreen(string user){ 
    system("CLS"); 
    cout << "Hello " + user << endl; 

    ifstream file(user + ".txt"); 
    string line1; 
    getline(file, line1); 
    // Begin reading your stream here 
    string line2; 
    getline(file, line2); 

    if(line2 == "newAccount"){ 
     cout << "Your account is new"; 

     char cUser[200]; 

     strcpy_s(cUser, user.c_str()); 

     std::ofstream newFile(user + ".txt.new"); 
     // Do output...!!!!!!! 
     newFile << line1; 
     newFile.close(); 
     if (newFile) { 
      remove(cUser + ".txt"); 
      rename(cUser + ".txt", cUser + ".txt"); 
     } else { 
      std::cerr << "Write error on output" << std::endl; 
     } 
    } 

} 

EDIT:

Я редактировал свой код к этому, и он по-прежнему не работает:

const string oldFileName(user + ".txt"); 
const string newFileName(user + ".txt.new"); 

std::ofstream newFile(user + ".txt.new"); 
// Do output...!!!!!!! 
newFile << line1; 
newFile.close(); 


if(line2 == "newAccount"){ 
    ofstream newFile(newFileName.c_str()); // c++11 allows std::string 
    if (newFile){ 
     if (0 == remove(oldFileName.c_str())){ 
      if (0 != rename(newFileName.c_str(), oldFileName.c_str())){ 
       // Handle rename failure. 
      } 
     }else{ 
      // Handle remove failure. 
     } 
    } 
+0

Я пытался использовать STRCPY (cUser, user.c_str ()); но мой компилятор ошибся и даже рекомендовал мне использовать strcpy_s – nlreturns

+0

Я откатил редактирование. Редактирование вопроса в ответ на ответы не помогает, поскольку оно делает текущие ответы бесполезными и смущает людей, которые приходят к вопросу позже. – hmjd

+0

@Hmjd, извините, я вырезал код из ответа на вопрос, не читая все комментарии. Я думаю, что это имеет смысл там, если записаны подпоследовательные изменения. – SoonDead

ответ

2

Этот:

rename(cUser + ".txt", cUser + ".txt"); 

неверен по двум причинам:

  1. он является указателем арифметика не строка contatenation, как cUser является char[]
  2. даже это было правильно contatenation имя старого файла и новое имя файла одинаковы

Там нет оснований использовать strcpy_s(), используйте operator+ для std::string:

const std::string oldFileName(user + ".txt"); 
const std::string newFileName(user + ".txt.new"); 

std::ofstream newFile(newFileName.c_str()); // c++11 allows std::string 
if (newFile && newFile << line1) 
{ 
    newFile.close(); 
    if (newFile) 
    { 
     if (0 == remove(oldFileName.c_str())) 
     { 
      if (0 != rename(newFileName.c_str(), oldFileName.c_str())) 
      { 
       // Handle rename failure. 
      } 
     } 
     else 
     { 
      // Handle remove failure. 
     } 
    } 
} 

Помните, что file.close() перед тем, как приступить к remove().

Всегда проверяйте результат операций ввода-вывода, код не подтверждает, что если file открыт или если какой-либо из getline() попытки были успешными:

ifstream file(user + ".txt"); 
if (file.is_open()) 
{ 
    string line1, line2; 
    if (getline(file, line1) && getline(file, line2)) 
    { 
     // Successfully read two lines. 
    } 
} 
+0

Я изменил свой код на ваши настройки, но он все еще не работает. Я редактировал свой пример кода сверху. – nlreturns

+0

Определить _not working_? – hmjd

+0

Новый файл не заполняется, и старый файл не удаляется и не заменяется. – nlreturns

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