2016-02-21 35 views
1

我試圖打開一個文件,並修改其中的一些內容。我的第一個代碼看起來是這樣,C++ - 修改文件而不創建新文件

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

using namespace std; 

int main(int argc, char** argv) { 
    int status = 0; 

    //error if no filename 
    if(argc == 1) { 
     cerr << "No file specified. Please specify a filename" << endl; 
     status = 1; 
    } 

    //open a file and modify 
    for (int i = 1; i < argc; ++i) { 
     string line = ""; 
     string filename = argv[i]; 
     ifstream infile; 

     infile.open(filename); 
     if(infile.fail()) { 
      status = 1; 
      cerr << filename << ": No Such File Exist" << endl; 
     } 
     else{ 
      while(getline(infile, line)) { 
       auto index1 = line.find('('); 
       auto index2 = line.find(')'); 
       cout << index1 << " " << index2 << endl; 
       auto itor = line.begin(); 
       if(index1 != string::npos) line[index1] = '['; 
       if(index2 != string::npos) line[index2] = ']'; 
      } 
      infile.close(); 
     } 
    } 


    return status; 
} 

我知道這是錯的直接修改line因爲它不會更改文件的內容。有沒有一種方法可以直接修改文件?(無需創建新文件,並輸出line

+0

@JoachimPileborg,因爲它只是將'('到'['和')'更改爲']''大小應該是相同的。 – Kevin217

回答

2

您可以:

  1. 商店的線條,改性和未改性,在std::vector<std::string>
  2. 關閉文件。
  3. 以寫入模式打開文件。
  4. 將存儲在std::vector<std::string>中的行保存到文件
  5. 關閉文件。

爲每個步驟創建單獨的函數會更好。

void readContents(std::string const& filename, 
        std::vector<std::string>& lines) 
{ 
    ... 
} 

void updateContents(std::vector<std::string>& lines) 
{ 
    ... 
} 

void WriteContents(std::string const& filename, 
        std::vector<std::string> const& lines) 
{ 
    ... 
} 

然後調用main

int main(int argc, char* argv[]) 
{ 
    ... 

    string filename = argv[i]; 
    std::vector<std::string> lines; 
    readContents(filename, lines); 
    updateContents(lines): 
    writeContents(filename, lines): 
} 
1

如果您要更改的數據不以任何方式更改文件的大小(即你不會試圖寫出比文件中現有數據更長或更短的數據),那麼可以,只要改變寫入位置就可以覆蓋現有數據。

另一方面,如果數據的大小不同,那麼它很難做到(您需要讀取所有內容並將其重新定位到文件中),只需編寫一個新文件並重命名它。

將一種大括號改爲另一種大小不會改變文件的大小,因此您可以輕鬆地做到這一點。當你找到一個你想改變的角色,set the write pointer到角色的位置並且寫入新的角色時,一次只讀取一個角色的文件。

+0

這是否意味着如果文件有80行? – Kevin217

+1

@ Kevin217文件的當前大小並不重要,它是新/修改數據的大小。如果你想添加或刪除單個角色,那麼這很難,但是如果你只是想將一個或多個角色改爲其他角色,那麼這沒什麼大不了的。 –

相關問題