[英]In-Place file editing
我目前正在尝试实现一个小的 function,它从一个文件中读取,对内容做一些事情并且应该就地替换它。 从文件中读取和写入文件的文本在大小上始终相同。 由于系统限制,我必须就地完成所有工作。 所以我写了一个小测试示例。 它写入“abcdefghijklmnop”16 次,关闭文件,再次打开,按 16 字节读取,并将其转换为大写(这里:简单的 char - 32)。 这只是我的问题的一个最小示例,我不会使用buf[b] = buf[b] - 32;
在现实生活中,某些字符会变大,所以请不要对此行发表评论;)
起初我尝试使用两个不同的ifstream
和ofstream
,但这没有用:它只是在文件末尾编辑了一些东西并擦除一些数据。
int main(int argc, char** argv) {
char buf[8];
std::ofstream testdata("testdata");
for(int i = 0; i < 16; ++i) {
testdata.write("abcdefghijklmnop", 16);
}
testdata.close();
std::ifstream in("testdata");
std::ofstream out("testdata", std::ofstream::app);
out.seekp(0, std::ofstream::beg);
for(int i = 0; i < 16; ++i) {
in.read(buf, 16);
for(int b = 0; b < 16; ++b) {
buf[b] = buf[b] - 32;
}
out.write(buf, 16);
}
in.close();
out.close();
return 0;
}
接下来,我尝试使用单个fstream
进行一些手动搜索。
int main(int argc, char** argv) {
char buf[8];
std::ofstream testdata("testdata");
for(int i = 0; i < 16; ++i) {
testdata.write("abcdefghijklmnop", 16);
}
testdata.close();
std::fstream stream("testdata", std::fstream::in | std::fstream::out);
stream.seekp(0,std::fstream::beg);
stream.seekg(0,std::fstream::beg);
auto inpos = stream.tellg();
auto outpos = stream.tellp();
for(int i = 0; i < 16; ++i) {
stream.seekg(inpos);
stream.read(buf, 16);
inpos = stream.tellg(); // also tried inpos += 16;
for(int b = 0; b < 16; ++b) {
buf[b] = buf[b] - 32;
}
stream.seekp(outpos);
stream.write(buf, 16);
outpos = stream.tellp(); // also tried outpos += 16;
}
stream.close();
return 0;
}
这会编辑前 8 个字节,扰乱接下来的 4 个字节,并保持 rest 不变。
我错过了什么? 还是我完全偏离了轨道?
正如@kMaster 在评论中指出的那样,第二个版本工作得很好。 唯一的问题是缓冲区大小不合适(8 个字节而不是 16 个字节)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.