【发布时间】:2012-06-19 22:36:03
【问题描述】:
我正在尝试编写一个函数,当调用该函数时,它将在我的文本文件中搜索与参数匹配的内容,然后通过覆盖文件来“更新”它。
这是我目前的功能:
编辑:这是新的更新代码,仍然无法正常工作:/
这是它发送到 UpdateGem 的行:(示例 sTempTxt:“AB:5.55”)
ostringstream stream;
stream << std::setprecision(3) << fEindgem;
string sTempTxt = sVak + ":" + stream.str() + "\n";
UpdateGem(sTempTxt);
void UpdateGem(string text)
{
ifstream f;
f.open("GEM.txt");
string sGEMS[100];
string temp[3];
splitstring(text, ":", temp[0], temp[1]);
bool OverWrite;
int count = 0;
string Delete, line;
while(true)
{
getline(f, sGEMS[count], '\n');
if(f.eof()) break;
splitstring(sGEMS[count], ":", temp[1], temp[2]);
if (temp[0] == temp[1])
{
OverWrite = 1;
Delete = sGEMS[count];
}
count++;
}
// Don't set count to 0, since we need it
// count = 0;
ofstream f2;
f2.open("GEM2.txt"/*,std::ios_base::app*/);
if (OverWrite)
{
f.seekg(0, std::ios::beg);
for (int i = 0; i < count; ++i)
{
if (sGEMS[i] != Delete) f2 << sGEMS[i];
}
}
f.close();
f2.close();
remove("GEM.txt");
rename("GEM2.txt", "GEM.txt");
ofstream file;
file.open("GEM.txt",std::ios_base::app);
file << text;
file.close();
}
它必须替换的行采用 NAME:NUMBER 的形式,其中数字可以不同,所以我使用 splitstring 函数将名称与找到的行的名称进行比较,然后完全擦除该行并通过稍后重新添加来“更新”它。但是,我当前的代码只将更新的行写入文件,而不是旧的...
【问题讨论】:
-
如果替换文本与被替换文本的大小不完全相同,则在文件中间覆盖是一个令人担忧的过程。
-
您有两个 while 循环在 f 上执行
getline。如果您在第一个循环中到达 eof,则第二个循环不会读取任何行。您应该在循环之间的某处重置流的内部获取指针。f.seekg(0, std::ios::beg); -
能否请您解释一下,用外行的话来说,我还是个初学者..
-
Write in the middle of a binary file without overwriting any existing content 的答案中有代码可能会让您对插入文件中间有所了解。该问题被标记为 C,因此答案也是 C,但它可能会帮助您了解有关将信息插入文件中间的一些想法。缩短文件更简单,但也需要小心。相比之下,用相同数量的新数据覆盖文件的一部分是微不足道的。这就是为什么固定长度的记录数据文件很受欢迎的原因。它们也很简单。
标签: c++ file fstream copying rewriting