用fstream怎样修改文件指定的一部分?

时间:2021-07-23 14:57:36
在有的情况下,只需要改变文件中指定的一部分,而不需要重写文件,应该怎么用?

9 个解决方案

#1


没人回答,那自己顶了。

#2


在C下干过,不知道对你有没有用

一:把所有文件读出来,改特定地方

二:跳文件指针,就能修改到特定地方

#3


谢谢 lbing7(楼主,别再给我非专家分!谢谢合作)
但我还是不太理解,我的意思是,比如文件中有一行内容为:
number=100

我想把=右边的100改成200,但不想把文件全部重新写一遍,可以实现吗?

#4


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的论坛会自动去掉每行前面的空格,所以上面的代码,每行前面的空格我用的是全角字符。直接拷贝下来需要把每行前面的全角空格去掉才可以编译:-)

#5


好贴,收藏了

#6


楼上的楼上的你忘了关闭文件了,呵呵

#7


细心:-)

不过显式的调用关闭函数并非必须,在fstream里面有一个filebuf类型的对象,它在析构的时候会关闭文件的:-)

#8


谢谢大家,不过我又碰到一个问题:
当多次调用getline()后,定位到某一行,要修改这一行中的某位置,除了用seekp()外,还需要什么函数吗?

#9


OK,小弟解决问题了,原来用tellg()函数就可以了。
多谢大家了!

#1


没人回答,那自己顶了。

#2


在C下干过,不知道对你有没有用

一:把所有文件读出来,改特定地方

二:跳文件指针,就能修改到特定地方

#3


谢谢 lbing7(楼主,别再给我非专家分!谢谢合作)
但我还是不太理解,我的意思是,比如文件中有一行内容为:
number=100

我想把=右边的100改成200,但不想把文件全部重新写一遍,可以实现吗?

#4


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的论坛会自动去掉每行前面的空格,所以上面的代码,每行前面的空格我用的是全角字符。直接拷贝下来需要把每行前面的全角空格去掉才可以编译:-)

#5


好贴,收藏了

#6


楼上的楼上的你忘了关闭文件了,呵呵

#7


细心:-)

不过显式的调用关闭函数并非必须,在fstream里面有一个filebuf类型的对象,它在析构的时候会关闭文件的:-)

#8


谢谢大家,不过我又碰到一个问题:
当多次调用getline()后,定位到某一行,要修改这一行中的某位置,除了用seekp()外,还需要什么函数吗?

#9


OK,小弟解决问题了,原来用tellg()函数就可以了。
多谢大家了!