簡體   English   中英

使用fstream和fstream.eof。 處理文件

[英]Using fstream and fstream.eof. Working with files

我正在嘗試編寫一個程序,該程序將讀取文件,將指定的單詞更改為符號“ @”,然后寫回同一文件。 但是我對此有疑問。

第一個問題。 似乎我需要在將文件寫入文件之前將其存儲在緩沖區中。 我該怎么辦?

第二個問題:我不明白為什么這段代碼中的循環永遠不會結束? 該文件中大約有200個單詞,但是我總是遇到內存異常,而我卻得到10075。

int main(int argc, char* argv[]){
    char** temp = new char*[10000];
    int i = 0;
    fstream fTemp("D:\doc.txt", ios_base::in);
    while (!fTemp.eof()){
        temp[i] = new char[50];
        fTemp >> temp[i];
        temp[i][1] = '@';
        cout << temp[i] << endl;
        i++;
    }
    fTemp.open("D:\doc.txt", ios_base::trunc);
    for (int i = 0; i < sizeof(*temp); i++){
        fTemp << temp[i];
    }
    _getch();
}

首先,您應該使用getline,因為您對eof的用法不正確(僅在讀取失敗后才設置eof位)。 接下來,將字符串存儲在std::vector<string> 這將使您不必關心內存管理(當前的內存正在泄漏),並提供了更靈活的解決方案。

std::string buffer;
std::vector<string> data;
while(std::getline(fTemp,buffer)) {
      data.push_back(buffer);
}

您可能遇到的問題是錯誤的eof()調用,請檢查cout輸出以確定此代碼是否存在問題。

要將文件的數據存儲在緩沖區中,您可以獲取文件的大小,並使用read函數獲取所有文件數據。 看到下面的代碼:

// Load file in a buffer
ifstream fl(FileName);
fl.seekg(0, ios::end);
size_t len = fl.tellg();
char* fdata = new char[len];
fl.seekg(0, ios::beg);
fl.read(fdata, len);
fl.close();

在您的情況下,您使用與打開時相同的fstream進行寫入,而無需在重新打開前關閉文件。

您的循環永遠不會結束,因為它是一個指針,並且它的大小不受管理,更好的方法是在打開文件時獲取文件的大小,在這種情況下,文件的大小為“ size_t len”。

要重寫代碼,可以創建另一個流,請參見以下代碼:

// Write File
ofstream flOut(FileName, ios_base::trunc);
flOut.write(fdata, len);
flOut.close();

在上面的這兩個代碼之間,您可以更改fdata的數據,但是您想做什么呢? 是將某些單詞替換為符號“ @”嗎? 哪個字?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM