2016-03-22 74 views
1

我使用下面的函數:C++:ifstream刪除文件的內容?

int getline_count() 
{ 
    boost::smatch resultc; 
    string sLine; 
    int line_add_tmp; 
    ifstream infile; 
    infile.open("scripts.txt", ios_base::in); 
    if (!infile){ 
     cerr << "scripts.txt could not be opened!" << endl; 
    } 
    else { 
     getline(infile, sLine); 
     if (boost::regex_match(sLine, c)) { 
      line_add = 2; 
     } 
     else { 
      line_add = 1; 
     } 

     return line_add; 
    infile.close(); 
    } 
} 

內涵的上述功能是測試文件中的第一行包含「//新的」如果爲真,則返回2。如果爲false,則返回1。迄今爲止,這工作得很好。

我感到困惑的是,運行後文件scripts.txt爲空。這怎麼可能是因爲

1.)'// new'行被正確識別爲我得到'2'返回(運行在一個空文件返回1預期)。因此,它不能是打開scripts.txt它的文件中,用一個空文件

2)ifstream的覆蓋被設計爲只讀

這是什麼,我缺少的是什麼?

編輯:

對於C

定義是

static const boost::regex 
    c("^(\\/)(\\/)(new|New| new| New)"); // Regexp for line count 
+0

您能否給我們定義'c'? –

+0

@Rhymoid我敢打賭它是:「// new」 –

+2

你的函數應該給你*至少* 2個編譯器警告。請先解決明顯的問題,然後提供[MCVE]。 – nvoigt

回答

2

ifstream不應該操縱你的文件。你需要在別處尋找你的問題,它不在這個代碼中。你最好的選擇是提供一個Minimal, Complete, and Verifiable example來證明你的問題。

但是,你應該檢查你的編碼,你錯過了像錯誤處理和處理編譯器警告的要領。很可能,如果你的其他代碼看起來一樣,那就是你的問題的根源。

就個人而言,我會寫你的函數是這樣的:

bool first_line_in_file_matches(const std::string& filename, const boost::regex& c) 
{ 
    std::string line; 
    std::ifstream infile(filename.c_str()); 

    if (!infile) 
    { 
     cerr << filename << " could not be opened!" << endl; 
     // TODO: THROW AN EXCEPTION MAYBE? OR RETURN FALSE? EXIT HERE 
    } 

    return getline(infile, line) && boost::regex_match(line, c); 
} 
+0

因爲OP想要一個空文件在你的情況下返回'1'或'false'。我會說你不應該在空文件上打印錯誤。刪除整個'if'-block並執行此操作可能會有好處:'return getline(infile,line)|| boost :: regex_match(line,c);'另外如果你的第一個'if'失敗,則提前退出將會有利可圖。 –

+0

@JonathanMee是的,也許。這只是OP可以說的。 – nvoigt

+0

他的確在問題中說:「在空文件上運行會返回1,如預期的那樣」 –

1

此功能不會清除文件的內容。因此,如果實際上文件被清除,它將從外部清除爲getline_count

爲了證明這一點,您就ifstream相對檢查每個呼叫的功能,該文件:

該函數在內部通過首先構造一個哨兵對象(noskipws設置爲true)來訪問輸入序列。然後(如果good),它從其關聯的流緩衝區對象中提取字符,就像調用其成員函數sbumpcsgetc一樣,最後在返回之前銷燬該哨兵對象。

  • ifstream::~ifstream這是隱式聲明,因此它只是破壞的對象,關閉文件;如果刪除的文件內容沒有人會一直能夠使用ifstream

推薦的步驟找到想要的文件清理的罪魁禍首是:

  1. 確保你在看正確的文件,並沒有一些處理外部到您的代碼是清除文件
  2. 搜索您的代碼爲「scripts.txt」別的東西必須訪問文件的名稱和調試它
  3. 禁止寫入「scripts.txt」並查看是否可以找到無法寫入文件的代碼