我正在尝试制作一个程序,它将读取文件,将指定的单词更改为符号'@'并写回同一文件。但我有问题。
第一个问题。 在将文件写入文件之前,我似乎需要将文件存储在缓冲区中。我该怎么办?第二个问题: 我不明白为什么这段代码中的循环永远不会结束?在该文件中大约有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();
}
答案 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 ;?哪个字?