first line
second line
third line
我要修改第2行的数据,fopen参数是什么?用哪个函数定位和修改?如果要插入呢?
9 个解决方案
#1
r+ 可读可写方式打开一个文本文件
#2
打开.
读取.
修改
写入
不要妄想捷径.. 没有
读取.
修改
写入
不要妄想捷径.. 没有
#3
fopen参数是什么?用哪个函数定位和修改?如果要插入呢?
==========================
fopen 参数用 a即可,
定位可以用 fseek ,不过要先知道移动指针的字符数...
也可以通过逐个字符查找下去,一直找到要修改的字符为止 ...
修改的时候,直接写入新的数据就可以了,
原来的数据会被覆盖。
注意,这里是覆盖,不是 插入,
如果要插入,
那么建议你读取文件,
并重新写到新的文件中,
到要插入的位置,
写新的要插入的数据,
然后继续读取文件后面的数据并写入新的文件 ...
因为文件不支持插入这样的操作 ....
==========================
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;
}
//---------------------------------------------------------------------------
#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 ,不过要先知道移动指针的字符数...
也可以通过逐个字符查找下去,一直找到要修改的字符为止 ...
修改的时候,直接写入新的数据就可以了,
原来的数据会被覆盖。
注意,这里是覆盖,不是 插入,
如果要插入,
那么建议你读取文件,
并重新写到新的文件中,
到要插入的位置,
写新的要插入的数据,
然后继续读取文件后面的数据并写入新的文件 ...
因为文件不支持插入这样的操作 ....
==========================
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;
}
//---------------------------------------------------------------------------
#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
可以把我的代码剥离开来的
其实你需要的很少
我只是给你一个参考而已
其实你需要的很少
我只是给你一个参考而已