首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用fstream和fstream.eof。使用文件

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

Stack Overflow用户
提问于 2014-12-29 14:59:19
回答 2查看 44关注 0票数 0

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

第一项质询。在将文件写入文件之前,我似乎需要将文件存储在缓冲区中。我怎么发动汽车呢?

第二个问题:我不明白为什么这段代码中的循环永远不会结束?文件中大约有200个单词,但是我总是得到内存异常,我得到10075个单词。

代码语言:javascript
复制
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();
}
EN

回答 2

Stack Overflow用户

发布于 2014-12-29 15:41:15

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

代码语言:javascript
复制
std::string buffer;
std::vector<string> data;
while(std::getline(fTemp,buffer)) {
      data.push_back(buffer);
}

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

票数 0
EN

Stack Overflow用户

发布于 2014-12-29 18:25:30

要将文件的数据存储在一个缓冲区中,可以获取文件的大小,并使用函数read来获取所有的文件数据。请参阅以下代码:

代码语言:javascript
复制
// 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“。

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

代码语言:javascript
复制
// Write File
ofstream flOut(FileName, ios_base::trunc);
flOut.write(fdata, len);
flOut.close();

在上面两个代码之间,你可以改变fdata的数据,但是你到底想做什么呢?是否将某些单词替换为符号“@”?哪个词?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27684681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档