请问:怎样修改文本文件中某一行的文字?

时间:2022-10-23 19:02:45
比如说文件有3行:

first line
second line
third line

我要修改第2行的数据,fopen参数是什么?用哪个函数定位和修改?如果要插入呢?

9 个解决方案

#1


r+  可读可写方式打开一个文本文件

#2


打开.
读取.
修改
写入

不要妄想捷径.. 没有

#3


fopen参数是什么?用哪个函数定位和修改?如果要插入呢?
==========================
fopen 参数用 a即可,
定位可以用 fseek ,不过要先知道移动指针的字符数...
也可以通过逐个字符查找下去,一直找到要修改的字符为止 ...
修改的时候,直接写入新的数据就可以了,
原来的数据会被覆盖。

注意,这里是覆盖,不是 插入,
如果要插入,
那么建议你读取文件,
并重新写到新的文件中,
到要插入的位置,
写新的要插入的数据,
然后继续读取文件后面的数据并写入新的文件 ...

因为文件不支持插入这样的操作 ....

#4


每次都要生成一个新文件,然后重名名,太麻烦了
,有没有比较成熟的例子看看

#5


每次都要生成一个新文件,然后重名名,太麻烦了

似乎这是最好的办法。。。

如果文件不太大的话,可以考虑把文件内容全部读入缓冲,然后修改缓冲中的内容,再覆盖源文件,不过我觉得还不如重新写一个新的文件来做。

#6


如果修改前后的数据是同样长的话,可以直接覆盖。

不然就只有新建文件了。

#7


参考一下我的项目的部分代码

//---------------------------------------------------------------------------


#pragma hdrstop

#include "u_IniSet.h"

#pragma package(smart_init)

//---------------------------------------------------------------------------
/*
template<class _FI, class _Ty = std::string>
inline void MYreplace(_FI _F, _FI _L, const _Ty& _Vo, const _Ty& _Vn){
for (; _F != _L; ++_F){
string::size_type st = (*_F).find(_Vo) ;
if(st!= std::string::npos){
(*_F).replace(st,_Vo.length(),_Vn);
}
}
}
*/
IniSet::IniSet(const string& InputFilename){
ifstream ifile(InputFilename.c_str());
string word;
vector<string> strvec;
while(ifile >> word){
strvec.push_back(word);
}
vector<string>::const_iterator iter;
for(iter = strvec.begin(); iter != strvec.end() ; ++iter){
if(IsContainStr(*iter,"ADUrl")){
ADUrl = *iter;
}
if(IsContainStr(*iter,"LinkUrl")){
LinkUrl = *iter;
}
if(IsContainStr(*iter,"ShowUrl")){
ShowUrl = *iter;
}
if(IsContainStr(*iter,"LinkWidth")){
LinkWidth = *iter;
}
}
}

void IniSet::SetADUrl(const string& str){

/////////////////////////////////////////////////////
string TempStr = "ADUrl";
string::size_type EqualLength = str.find("=");
if(EqualLength != string::npos)
ADUrl.replace(EqualLength + 1,TempStr.length(),str);
/////////////////////////////////////////////////////
}

void IniSet::SetLinkUrl(const string& str){
string TempStr = "LinkUrl";
string::size_type EqualLength = str.find("=");
if(EqualLength != string::npos)
LinkUrl.replace(EqualLength + 1,TempStr.length(),str);
}

void IniSet::SetShowUrl(const string& str){
string TempStr = "ShowUrl";
string::size_type EqualLength = str.find("=");
if(EqualLength != string::npos)
ShowUrl.replace(EqualLength + 1,TempStr.length(),str);
}

void IniSet::SetLinkWidth(const string& str){
string TempStr = "LinkWidth";
string::size_type EqualLength = str.find("=");
if(EqualLength != string::npos)
LinkWidth.replace(EqualLength + 1,TempStr.length(),str);
}

bool IniSet::IsContainStr(const string& SourceStr,const string& ContainStr) const{
  return (SourceStr.find(ContainStr)== string::npos) ? false:true;
}

void IniSet::UpdateFile(const string& OutputFilename,const string& ADUrl,const string& LinkUrl,const string& ShowUrl,const string& LinkWidth){
SetADUrl(ADUrl);
SetLinkUrl(LinkUrl);
SetShowUrl(ShowUrl);
SetLinkWidth(LinkWidth);
ofstream ofile(OutputFilename.c_str());
ofile.clear();
ofile << ADUrl << endl;
ofile << LinkUrl << endl;
ofile << ShowUrl << endl;
ofile << LinkWidth << endl;
}



#8


好长的代码

#9


可以把我的代码剥离开来的
其实你需要的很少
我只是给你一个参考而已

#1


r+  可读可写方式打开一个文本文件

#2


打开.
读取.
修改
写入

不要妄想捷径.. 没有

#3


fopen参数是什么?用哪个函数定位和修改?如果要插入呢?
==========================
fopen 参数用 a即可,
定位可以用 fseek ,不过要先知道移动指针的字符数...
也可以通过逐个字符查找下去,一直找到要修改的字符为止 ...
修改的时候,直接写入新的数据就可以了,
原来的数据会被覆盖。

注意,这里是覆盖,不是 插入,
如果要插入,
那么建议你读取文件,
并重新写到新的文件中,
到要插入的位置,
写新的要插入的数据,
然后继续读取文件后面的数据并写入新的文件 ...

因为文件不支持插入这样的操作 ....

#4


每次都要生成一个新文件,然后重名名,太麻烦了
,有没有比较成熟的例子看看

#5


每次都要生成一个新文件,然后重名名,太麻烦了

似乎这是最好的办法。。。

如果文件不太大的话,可以考虑把文件内容全部读入缓冲,然后修改缓冲中的内容,再覆盖源文件,不过我觉得还不如重新写一个新的文件来做。

#6


如果修改前后的数据是同样长的话,可以直接覆盖。

不然就只有新建文件了。

#7


参考一下我的项目的部分代码

//---------------------------------------------------------------------------


#pragma hdrstop

#include "u_IniSet.h"

#pragma package(smart_init)

//---------------------------------------------------------------------------
/*
template<class _FI, class _Ty = std::string>
inline void MYreplace(_FI _F, _FI _L, const _Ty& _Vo, const _Ty& _Vn){
for (; _F != _L; ++_F){
string::size_type st = (*_F).find(_Vo) ;
if(st!= std::string::npos){
(*_F).replace(st,_Vo.length(),_Vn);
}
}
}
*/
IniSet::IniSet(const string& InputFilename){
ifstream ifile(InputFilename.c_str());
string word;
vector<string> strvec;
while(ifile >> word){
strvec.push_back(word);
}
vector<string>::const_iterator iter;
for(iter = strvec.begin(); iter != strvec.end() ; ++iter){
if(IsContainStr(*iter,"ADUrl")){
ADUrl = *iter;
}
if(IsContainStr(*iter,"LinkUrl")){
LinkUrl = *iter;
}
if(IsContainStr(*iter,"ShowUrl")){
ShowUrl = *iter;
}
if(IsContainStr(*iter,"LinkWidth")){
LinkWidth = *iter;
}
}
}

void IniSet::SetADUrl(const string& str){

/////////////////////////////////////////////////////
string TempStr = "ADUrl";
string::size_type EqualLength = str.find("=");
if(EqualLength != string::npos)
ADUrl.replace(EqualLength + 1,TempStr.length(),str);
/////////////////////////////////////////////////////
}

void IniSet::SetLinkUrl(const string& str){
string TempStr = "LinkUrl";
string::size_type EqualLength = str.find("=");
if(EqualLength != string::npos)
LinkUrl.replace(EqualLength + 1,TempStr.length(),str);
}

void IniSet::SetShowUrl(const string& str){
string TempStr = "ShowUrl";
string::size_type EqualLength = str.find("=");
if(EqualLength != string::npos)
ShowUrl.replace(EqualLength + 1,TempStr.length(),str);
}

void IniSet::SetLinkWidth(const string& str){
string TempStr = "LinkWidth";
string::size_type EqualLength = str.find("=");
if(EqualLength != string::npos)
LinkWidth.replace(EqualLength + 1,TempStr.length(),str);
}

bool IniSet::IsContainStr(const string& SourceStr,const string& ContainStr) const{
  return (SourceStr.find(ContainStr)== string::npos) ? false:true;
}

void IniSet::UpdateFile(const string& OutputFilename,const string& ADUrl,const string& LinkUrl,const string& ShowUrl,const string& LinkWidth){
SetADUrl(ADUrl);
SetLinkUrl(LinkUrl);
SetShowUrl(ShowUrl);
SetLinkWidth(LinkWidth);
ofstream ofile(OutputFilename.c_str());
ofile.clear();
ofile << ADUrl << endl;
ofile << LinkUrl << endl;
ofile << ShowUrl << endl;
ofile << LinkWidth << endl;
}



#8


好长的代码

#9


可以把我的代码剥离开来的
其实你需要的很少
我只是给你一个参考而已