2013-05-13 146 views
4

我試圖從我的.txt文件中刪除一行。該文件包含有關該帳戶的所有信息。C++從.txt文件中刪除行

該行在創建帳戶時顯示「newAccount」。我使用這個命令,以便在第一次登錄時啓動教程。在教程之後,我想刪除此行,以便在下次登錄時不會獲得教程。

繼承人的代碼片段:(不工作)

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; 
     } 
    } 

} 

編輯:

我已經編輯我的代碼,這一點,它仍然無法正常工作:

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 2013-05-13 09:53:37

+0

我回滾了編輯。編輯問題以回答問題是沒有幫助的,因爲它會使當前的答案無益,並且會讓後來出現問題的人感到困惑。 – hmjd 2013-05-13 11:20:21

+0

@Hmjd,對不起,我已經將答案中的代碼從問題中刪除,但沒有閱讀所有評論。我認爲這是有道理的,如果後續編輯陳述。 – SoonDead 2013-05-13 11:27:26

回答

2

此:

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

是不正確的原因有兩個:

  1. 是指針運算不串contatenation爲cUserchar[]
  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()吧。

經常檢查IO操作的結果,該代碼不確認,如果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 2013-05-13 11:17:30

+0

定義_not working_? – hmjd 2013-05-13 11:21:21

+0

新文件未被填充,舊文件未被刪除並被替換。 – nlreturns 2013-05-13 11:23:24