2011-12-13 38 views
0

我有一個功能,可以在一個文件中同時交換兩個字符,但是如果我嘗試多次使用該函數,則前一個交換將會從文本文件和原始文本中刪除現在回來了,因此第二個變化看起來是我的第一個變化。我該如何解決這個問題?保持文本文件不被擦除,而是保持寫入的能力? C++

void swapping_letters() 
{ 
    ifstream inFile("decrypted.txt"); 
    ofstream outFile("swap.txt"); 
    char a; 
    char b; 
    vector<char> fileChars; 

    if (inFile.is_open()) 
    { 
     cout<<"What is the letter you want to replace?"<<endl; 
     cin>>a;    
     cout<<"What is the letter you want to replace it with?"<<endl; 
     cin>>b; 

     while (inFile.good()) 
     { 
      char c; 
      inFile.get(c); 
      fileChars.push_back(c); 
     }     
     replace(fileChars.begin(),fileChars.end(),a,b); 
    } 
    else 
    { 
     cout<<"Please run the decrypt."<<endl; 
    } 

    for(int i = 0; i < fileChars.size(); i++) 
    { 
     outFile<<fileChars[i]; 
    } 
} 

回答

1

什麼你可能想要做的就是你的參數功能:

void swapping_letters(string inFileName, string outFileName) 
{ 
    ifstream inFile(inFileName); 
    ofstream outFile(outFileName); 
    ... 

因爲你沒有參數,調用它的兩倍,相當於:

swapping_letters("decrypted.txt", "swap.txt"); 
swapping_letters("decrypted.txt", "swap.txt"); 

但「在第一次調用之後,「decrypted.txt」未被修改,因爲您不更改輸入文件。所以,如果你想使用的第一個操作的輸出作爲輸入到第二你必須寫:

swapping_letters("decrypted.txt", "intermediate.txt"); 
swapping_letters("intermediate.txt", "swap.txt"); 

有處理這個問題的其他途徑。通過一次讀取文件中的一個字符,您正在進行相當多的函數調用......一百萬字節的文件將涉及100萬次調用get()和100萬次調用push_back()。大部分時間的內部緩衝意味着這不會是太慢了,但還有更好的方法:

Read whole ASCII file into C++ std::string

需要注意的是,如果這是你解決實際問題,你實際上並不需要將整個文件讀入內存。您可以按塊(或按字符逐個字符)讀取文件,並在不保留整個文件的情況下執行輸出。

您可能在某些時候感興趣的高級思想是內存映射文件。這使您可以像處理大數組一樣處理磁盤文件,並輕鬆地在內存中對其進行修改......同時讓操作系統擔心一次只能分頁或分頁多少文件的詳細信息。他們是非常適合的一些問題,並有一個C++獨立於平臺的API爲內存映射文件的Boost庫:

http://en.wikipedia.org/wiki/Memory-mapped_file

+0

能看到烏爾着落,但我現在運行於低的時候,我的編譯器不喜歡我在做什麼,呃,那麼只是把代碼放在程序中而不是有一個函數,我猜可以把所有我需要的字母一次換掉,而不是每次寫入文件,謝謝! – Dom