用fstream怎样修改文件指定的一部分?
在有的情况下,只需要改变文件中指定的一部分,而不需要重写文件,应该怎么用? 问题点数:25、回复次数:9Top
1 楼windywater(超级宇宙无敌大白痴)回复于 2006-03-03 14:37:40 得分 0
没人回答,那自己顶了。Top
2 楼lbing7(向青润老大学习!!!)回复于 2006-03-03 14:48:33 得分 3
在C下干过,不知道对你有没有用
一:把所有文件读出来,改特定地方
二:跳文件指针,就能修改到特定地方Top
3 楼windywater(超级宇宙无敌大白痴)回复于 2006-03-03 14:53:31 得分 0
谢谢 lbing7(楼主,别再给我非专家分!谢谢合作)
但我还是不太理解,我的意思是,比如文件中有一行内容为:
number=100
我想把=右边的100改成200,但不想把文件全部重新写一遍,可以实现吗?Top
4 楼ddddh(叶君临)回复于 2006-03-03 15:06:25 得分 13
fstream 派生自 basic_fstream,后者又派生自basic_iostream,后者又派生自 basic_ostream。
而basic_ostream提供了:
basic_ostream& seekp(pos_type pos);
basic_ostream& seekp(off_type off, ios_base::seek_dir way);
两个函数,可以用来在文件中定位:-)
附测试代码:
--- fs.cpp ---
#include <fstream>
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::fstream;
using std::string;
int main(int argc, char **argv)
{
if (argc != 2)
{
cout << "Usage: fs <filename>" << endl;
return -1;
}
fstream fs;
fs.open(argv[1]);
fs.seekp(10);
string s("happy!");
fs << s;
return 0;
}
------------------------
编译出fs.exe
然后用fs test.txt可以测试结果
test.txt原本内容为
abcdefghijklmn12345
执行完毕之后为
abcdefghijhappy!345
PS.
csdn的论坛会自动去掉每行前面的空格,所以上面的代码,每行前面的空格我用的是全角字符。直接拷贝下来需要把每行前面的全角空格去掉才可以编译:-)
Top
5 楼jobs002(Oh! Office)回复于 2006-03-03 15:27:46 得分 3
好贴,收藏了Top
6 楼myhouwei(myhouwei)回复于 2006-03-03 16:31:36 得分 3
楼上的楼上的你忘了关闭文件了,呵呵Top
7 楼ddddh(叶君临)回复于 2006-03-03 17:31:09 得分 3
细心:-)
不过显式的调用关闭函数并非必须,在fstream里面有一个filebuf类型的对象,它在析构的时候会关闭文件的:-)
Top
8 楼windywater(超级宇宙无敌大白痴)回复于 2006-03-03 21:17:03 得分 0
谢谢大家,不过我又碰到一个问题:
当多次调用getline()后,定位到某一行,要修改这一行中的某位置,除了用seekp()外,还需要什么函数吗?Top
9 楼windywater(超级宇宙无敌大白痴)回复于 2006-03-03 22:20:20 得分 0
OK,小弟解决问题了,原来用tellg()函数就可以了。
多谢大家了!Top




