Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Question of ofstream / fstream methods to modify a specific line in atext file.

Reply
Thread Tools

Question of ofstream / fstream methods to modify a specific line in atext file.

 
 
Ramesh
Guest
Posts: n/a
 
      10-17-2008
Hello,

I am using the ofstream class to create a text file with keys and
values like:

Key1=Value10
Key2=Value15
Key3=Value20

In case I need to set a new value for Key2, say value50 - I am able to
read and get the value, not sure how to replace that specific value
after '=' for a specific line - Please advice which class / method can
help me achieve this?

thanks
/R

Here is my code snippet:

-----
using namespace std;

#include <iostream>



bool SetVal4Key(std::string Key, std::string Value) {

ofstream cfgfile;
bool status = FALSE;
string sLine;
string buf;
UINT32 pos = 0;
string Delim = "=";


cfgfile.open ("/etc/config.txt", ios::noreplace | ios::app);
if (!cfgfile) {
cout << Failed to open config file - unable to continue" << endl;
return status;
}

while (!cfgfile.eof()) {

std::getline(cfgfile, buf);

// Dump the content for debugging purpose

len = buf.size();
pos = buf.find(Key, 0);

if (!pos) {
pos = buf.find(Delim, 0);

//Modify the string
buf.erase
buf= Key;
buf.append = Value;

// Write to the specific line in the file where the key is already
present
status = TRUE;
cfgfile.close();
status = TRUE;
}
cout << "Failed to locate the key" << endl;
}
return status;

}

----
 
Reply With Quote
 
 
 
 
Barry
Guest
Posts: n/a
 
      10-17-2008
On Oct 17, 9:44*am, Ramesh <(E-Mail Removed)> wrote:
> Hello,
>
> I am using the ofstream class to create a text file with keys and
> values like:
>
> Key1=Value10
> Key2=Value15
> Key3=Value20
>
> In case I need to set a new value for Key2, say value50 - I am able to
> read and get the value, not sure how to replace that specific value
> after '=' for a specific line - Please advice which class / method can
> help me achieve this?
>
> thanks
> /R
>
> Here is my code snippet:
>
> -----
> using namespace std;
>
> #include <iostream>
>
> bool SetVal4Key(std::string Key, std::string Value) {
>
> ofstream * * * *cfgfile;
> bool * * * * * *status = FALSE;
> string * * * * *sLine;
> string * * * * *buf;
> UINT32 * * * * *pos = 0;
> string * * * * *Delim = "=";
>
> cfgfile.open ("/etc/config.txt", ios::noreplace | ios::app);
> if (!cfgfile) {
> * * * * cout << Failed to open config file - unable to continue" << endl;
> * * * * return status;
>
> }
>
> while (!cfgfile.eof()) {
>
> * * * * std::getline(cfgfile, buf);
>
> * * * * // Dump the content for debugging purpose
>
> * * * * len = buf.size();
> * * * * pos = buf.find(Key, 0);
>
> * * * * if (!pos) {
> * * * * * * * * pos = buf.find(Delim, 0);
>
> * * * * * * * * //Modify the string
> * * * * * * * * buf.erase
> * * * * * * * * buf= Key;
> * * * * * * * * buf.append = Value;
>
> * * * * * * * * // Write to the specific line in the file where the key is already
> present
> * * * * * * * * status = TRUE;
> * * * * * * * * cfgfile.close();
> * * * * * * * * status = TRUE;
> * * * * }
> * * * * cout << "Failed to locate the key" << endl;}
>
> return status;
>
> }
>

ios::noreplace is none-standard.

There's no way to modify the file inplace with standard C++.
You can load the file into vector<string>
modifies the strings. then overwrite the original file.

if the file to too large to do so, find out the platform APIs to
modify inplace.

--
Best Regards
Barry
 
Reply With Quote
 
 
 
 
Ramesh
Guest
Posts: n/a
 
      10-17-2008
On Oct 16, 6:57*pm, Barry <(E-Mail Removed)> wrote:
> On Oct 17, 9:44*am, Ramesh <(E-Mail Removed)> wrote:
>
> > Hello,

>
> > I am using the ofstream class to create a text file with keys and
> > values like:

>
> > Key1=Value10
> > Key2=Value15
> > Key3=Value20

>
> > In case I need to set a new value for Key2, say value50 - I am able to
> > read and get the value, not sure how to replace that specific value
> > after '=' for a specific line - Please advice which class / method can
> > help me achieve this?

>
> > thanks
> > /R

>
> > Here is my code snippet:

>
> > -----
> > using namespace std;

>
> > #include <iostream>

>
> > bool SetVal4Key(std::string Key, std::string Value) {

>
> > ofstream * * * *cfgfile;
> > bool * * * * * *status = FALSE;
> > string * * * * *sLine;
> > string * * * * *buf;
> > UINT32 * * * * *pos = 0;
> > string * * * * *Delim = "=";

>
> > cfgfile.open ("/etc/config.txt", ios::noreplace | ios::app);
> > if (!cfgfile) {
> > * * * * cout << Failed to open config file - unable to continue" << endl;
> > * * * * return status;

>
> > }

>
> > while (!cfgfile.eof()) {

>
> > * * * * std::getline(cfgfile, buf);

>
> > * * * * // Dump the content for debugging purpose

>
> > * * * * len = buf.size();
> > * * * * pos = buf.find(Key, 0);

>
> > * * * * if (!pos) {
> > * * * * * * * * pos = buf.find(Delim, 0);

>
> > * * * * * * * * //Modify the string
> > * * * * * * * * buf.erase
> > * * * * * * * * buf= Key;
> > * * * * * * * * buf.append = Value;

>
> > * * * * * * * * // Write to the specific line in the file where the key is already
> > present
> > * * * * * * * * status = TRUE;
> > * * * * * * * * cfgfile.close();
> > * * * * * * * * status = TRUE;
> > * * * * }
> > * * * * cout << "Failed to locate the key" << endl;}

>
> > return status;

>
> > }

>
> ios::noreplace is none-standard.
>
> There's no way to modify the file inplace with standard C++.
> You can load the file into vector<string>
> modifies the strings. then overwrite the original file.
>
> if the file to too large to do so, find out the platform APIs to
> modify inplace.
>
> --
> Best Regards
> Barry


Yeah just learnt about replace after the compiler didnt like it - am
using ios:ut | ios::app in its place.
I am still digging to see if fseek / fsetpos related functions in
cstdio can be handy, but no clear idea yet

But thanks a bunch for your quick response.
 
Reply With Quote
 
red floyd
Guest
Posts: n/a
 
      10-17-2008
Ramesh wrote:
> On Oct 16, 6:57 pm, Barry <(E-Mail Removed)> wrote:
>> On Oct 17, 9:44 am, Ramesh <(E-Mail Removed)> wrote:
>>
>>> Hello,
>>> I am using the ofstream class to create a text file with keys and
>>> values like:
>>> Key1=Value10
>>> Key2=Value15
>>> Key3=Value20
>>> In case I need to set a new value for Key2, say value50 - I am able to
>>> read and get the value, not sure how to replace that specific value
>>> after '=' for a specific line - Please advice which class / method can
>>> help me achieve this?
>>> thanks
>>> /R
>>> Here is my code snippet:
>>> -----
>>> using namespace std;
>>> #include <iostream>
>>> bool SetVal4Key(std::string Key, std::string Value) {
>>> ofstream cfgfile;
>>> bool status = FALSE;
>>> string sLine;
>>> string buf;
>>> UINT32 pos = 0;
>>> string Delim = "=";
>>> cfgfile.open ("/etc/config.txt", ios::noreplace | ios::app);
>>> if (!cfgfile) {
>>> cout << Failed to open config file - unable to continue" << endl;
>>> return status;
>>> }
>>> while (!cfgfile.eof()) {
>>> std::getline(cfgfile, buf);
>>> // Dump the content for debugging purpose
>>> len = buf.size();
>>> pos = buf.find(Key, 0);
>>> if (!pos) {
>>> pos = buf.find(Delim, 0);
>>> //Modify the string
>>> buf.erase
>>> buf= Key;
>>> buf.append = Value;
>>> // Write to the specific line in the file where the key is already
>>> present
>>> status = TRUE;
>>> cfgfile.close();
>>> status = TRUE;
>>> }
>>> cout << "Failed to locate the key" << endl;}
>>> return status;
>>> }

>> ios::noreplace is none-standard.
>>
>> There's no way to modify the file inplace with standard C++.
>> You can load the file into vector<string>
>> modifies the strings. then overwrite the original file.
>>
>> if the file to too large to do so, find out the platform APIs to
>> modify inplace.
>>
>> --
>> Best Regards
>> Barry

>
> Yeah just learnt about replace after the compiler didnt like it - am
> using ios:ut | ios::app in its place.
> I am still digging to see if fseek / fsetpos related functions in
> cstdio can be handy, but no clear idea yet


The problem is that if you tweak the file inplace, and your replacement
text is bigger, you will clobber text:

e.g.


Key=Value15
Key=Value20

If you replace "Value15" with "Value100", you will get

Key=Value15Key=Value100

It's much safer to read it all, modify it, and write it back out.

 
Reply With Quote
 
news.chris.theis@gmail.com
Guest
Posts: n/a
 
      10-17-2008
On Oct 17, 4:09*am, Ramesh <(E-Mail Removed)> wrote:
>
> Yeah just learnt about replace after the compiler didnt like it - am
> using ios:ut | ios::app in its place.
> I am still digging to see if fseek / fsetpos related functions in
> cstdio can be handy, but no clear idea yet
>


I'm afraid that fseek & fsetpos won't be much help as you're dealing
with ASCII files. I'd go with Barry's advice to read the whole file
and replace the specific line which needs to be modified before
writing the contents back to another file.

Cheers
Chris

 
Reply With Quote
 
Ramesh
Guest
Posts: n/a
 
      10-17-2008
On Oct 17, 1:28*am, (E-Mail Removed) wrote:
> On Oct 17, 4:09*am, Ramesh <(E-Mail Removed)> wrote:
>
>
>
> > Yeah just learnt about replace after the compiler didnt like it - am
> > using ios:ut | ios::app in its place.
> > I am still digging to see if fseek / fsetpos related functions in
> > cstdio can be handy, but no clear idea yet

>
> I'm afraid that fseek & fsetpos won't be much help as you're dealing
> with ASCII files. I'd go with Barry's advice to read the whole file
> and replace the specific line which needs to be modified before
> writing the contents back to another file.
>
> Cheers
> Chris


Thanks, yes I gave up - really not worth spending time
right now doing a removal of the old file and modified contents go
into a new file.

Regards
Ramesh
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
fstream vs ofstream chiku C++ 6 05-05-2009 02:59 PM
Newbie Question: How do I know how many rows of text will appear in atext area? Tojuso Javascript 3 11-27-2007 11:09 PM
fstream and ofstream bballmitch C++ 2 09-01-2005 09:26 PM
ofstream * vs. ofstream Squid Seven C++ 5 07-14-2005 07:34 AM
what is different between <fstream.h> and <fstream>MS VC++ Armando C++ 6 01-29-2004 09:01 AM



Advertisments