我正在尝试编写一个程序,它将读取文件,将指定的单词更改为符号'@‘,并写回相同的文件。但我对此有疑问。
第一项质询。在将文件写入文件之前,我似乎需要将文件存储在缓冲区中。我怎么发动汽车呢?
第二个问题:我不明白为什么这段代码中的循环永远不会结束?文件中大约有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();
}发布于 2014-12-29 15:41:15
首先,你应该使用getline,因为你的eof的用法是不正确的(eof位只有在读取失败后才会被设置)。接下来,将字符串存储在std::vector<string>中。这将允许您不关心内存管理(当前内存管理正在泄漏),并提供更灵活的解决方案。
std::string buffer;
std::vector<string> data;
while(std::getline(fTemp,buffer)) {
data.push_back(buffer);
}你可能遇到的问题是不正确的eof()调用,你应该检查你的cout输出来确定这段代码的问题。
发布于 2014-12-29 18:25:30
要将文件的数据存储在一个缓冲区中,可以获取文件的大小,并使用函数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的数据,但是你到底想做什么呢?是否将某些单词替换为符号“@”?哪个词?
https://stackoverflow.com/questions/27684681
复制相似问题