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

时间:2014-12-29 06:59:19

标签: c++ file fstream

我正在尝试制作一个程序,它将读取文件,将指定的单词更改为符号'@'并写回同一文件。但我有问题。

第一个问题。 在将文件写入文件之前,我似乎需要将文件存储在缓冲区中。我该怎么办?

第二个问题: 我不明白为什么这段代码中的循环永远不会结束?在该文件中大约有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();
}

2 个答案:

答案 0 :(得分:0)

首先,您应该使用getline,因为您的eof使用不正确(仅在读取失败后才设置eof位)。 接下来,将字符串存储在std::vector<string>中。这将使您不必关心内存管理(当前正在泄漏)并提供更灵活的解决方案。

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

你可能遇到的问题是eof()调用不正确,你应该检查cout输出以确定此代码的问题。

答案 1 :(得分:0)

将文件数据存储在缓冲区中,可以获取文件大小并使用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被用来在不关闭文件的情况下进行写入。

你的循环永远不会结束,因为它是一个指针,并且它的大小不受管理,更好的方法是在文件打开时获取文件的大小,在这种情况下,文件的大小是&#34; size_t len&#34;。

要重写您的代码,您可以创建另一个流,请参阅以下代码:

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

在上面这两个代码之间,你可以改变fdata的数据,但究竟你想要做什么?将某些单词替换为符号&#39; @&#39 ;?哪个字?