PureBytes Links
Trading Reference Links
|
You don't need that - as in the code I provided - you read the entire file into memory
and then you save onto the same file name.
Also you can use AFL COM object support and use FileSystemObject to do renames
if you are really very afraid of "successful write" .
Best regards,
Tomasz Janeczko
amibroker.com
----- Original Message -----
From: "gp_sydney" <gp.investment@xxxxxxxxx>
To: <amibroker@xxxxxxxxxxxxxxx>
Sent: Monday, July 23, 2007 1:40 AM
Subject: [amibroker] Re: fopen
> The only problem with that theory being that AFL doesn't seem to
> support the file rename function either...
>
>
> --- In amibroker@xxxxxxxxxxxxxxx, "gp_sydney" <gp.investment@xxx> wrote:
>>
>> Ed,
>>
>> As Tomasz said, exposing fseek etc. in a DLL would be fairly easy, but
>> using them can be difficult. Typically this would only be done with
>> files that have fixed length records in them, which is rarely the case
>> with any sort of text file.
>>
>> One thing to be wary of with Tomasz's code is that the moment you open
>> the file for write with the same filename, you've deleted your
>> original file. If the writing doesn't complete successfully for any
>> reason, you've lost the file. That's why I prefer writing to a
>> temporary file and only deleting and renaming once the file has been
>> successfully written. Even if the rename fails, the temporary file
>> will still be sitting there. Otherwise you need to make sure you
>> always keep a recent backup of the file (which of course is a good
>> idea anyway).
>>
>> Regards,
>> GP
>>
>>
>> --- In amibroker@xxxxxxxxxxxxxxx, "Edward Pottasch" <empottasch@>
>> wrote:
>> >
>> > great idea. Didn't think of that. Thanks a lot!
>> >
>> > regards, ed
>> >
>> >
>> >
>> >
>> > ----- Original Message -----
>> > From: Tomasz Janeczko
>> > To: amibroker@xxxxxxxxxxxxxxx
>> > Sent: Sunday, July 22, 2007 8:03 PM
>> > Subject: Re: [amibroker] Re: fopen
>> >
>> >
>> >
>> > Hello,
>> >
>> >
>> > >I thought of StrReplace also. You can read a single line from a
>> file, save it in a string array, replace a certain part in this
>> string, but then you will not be able to put it back to the same
>> file. At >least I do not know how to do it in AFL. Indeed this
>> can be used if you write it to another file using AFL only.
>> >
>> > This part is easy.
>> > fgets - this function reads entire LINE into string variable. You
>> can read all lines using simple while loop and feof()
>> >
>> > fh = fopen("filename", "r" );
>> >
>> > line = 0;
>> > while( ! feof( fh ) )
>> > {
>> > VarSetText("line"+(line++), fgets( fh ));
>> > }
>> >
>> > fclose( fh );
>> >
>> > // now you have all lines in lineNNN variables
>> > /// manipulate them here and then write to the SAME file
>> >
>> > fh = fopen("filename", "w" );
>> >
>> > for( i = 0; i < line; i++ )
>> > {
>> > fputs( VarGetText("line"+i, fh );
>> > }
>> >
>> > fclose( fh );
>> >
>> > Best regards,
>> > Tomasz Janeczko
>> > amibroker.com
>> > ----- Original Message -----
>> > From: Edward Pottasch
>> > To: amibroker@xxxxxxxxxxxxxxx
>> > Sent: Sunday, July 22, 2007 7:54 PM
>> > Subject: Re: [amibroker] Re: fopen
>> >
>> >
>> > using "r+" works but it is not that simple. It works as in C and
>> I believe opening a file with "r+" is a pointer and in C you need
>> certain functions to work with them (fseek, rewind .... i believe).
>> As far as I understand now it can be done but not in AFL alone.
>> >
>> > I thought of StrReplace also. You can read a single line from a
>> file, save it in a string array, replace a certain part in this
>> string, but then you will not be able to put it back to the same
>> file. At least I do not know how to do it in AFL. Indeed this can
>> be used if you write it to another file using AFL only.
>> >
>> > regards, Ed
>> >
>> >
>> >
>> >
>> > ----- Original Message -----
>> > From: dingo
>> > To: amibroker@xxxxxxxxxxxxxxx
>> > Sent: Sunday, July 22, 2007 7:24 PM
>> > Subject: RE: [amibroker] Re: fopen
>> >
>> >
>> >
>> > If the r+ thingy handles the rewrite of a different sized file
>> then you can do it without 2 files.
>> >
>> > Also, you can simplify the whole thing by looking at the
>> string functions in AFL: StrReplace, etc.
>> >
>> > d
>> >
>> >
>> >
>> >
> ------------------------------------------------------------------------
>> > From: amibroker@xxxxxxxxxxxxxxx
>> [mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf Of Edward Pottasch
>> > Sent: Sunday, July 22, 2007 1:16 PM
>> > To: amibroker@xxxxxxxxxxxxxxx
>> > Subject: Re: [amibroker] Re: fopen
>> >
>> >
>> > hi Ara,
>> >
>> > I asked for this functionality in the feedback centre and
>> get a reply that this functionality exists. Indeed "r+" seems to be
>> working. However I am not sure if it can be solved in AFL entirely or
>> that one needs to write a dll for it, or some script. I focus on AFL
>> so I guess I will need to write the adjusted file to a new filename ...
>> >
>> > Also I guess it would not be so hard to write a function in
>> C++ that replaces some text in the form of a dll, nice would be to
>> solve it in AFL.
>> >
>> > regards, ed
>> >
>> >
>> >
>> >
>> > ----- Original Message -----
>> > From: Ara Kaloustian
>> > To: amibroker@xxxxxxxxxxxxxxx
>> > Sent: Sunday, July 22, 2007 7:00 PM
>> > Subject: Re: [amibroker] Re: fopen
>> >
>> >
>> >
>> > Ed,
>> >
>> > I beleive for a text file, only way to handle it is to
>> read the file (line by line), make the chages you want and create a
>> second file with the modifications.The delete original file.
>> > ----- Original Message -----
>> > From: Edward Pottasch
>> > To: amibroker@xxxxxxxxxxxxxxx
>> > Sent: Sunday, July 22, 2007 7:59 AM
>> > Subject: Re: [amibroker] Re: fopen
>> >
>> >
>> > hi GP,
>> >
>> > yes I thought of that as well and this is easy to
>> implement however since it seems possible to use
>> >
>> > // open file
>> > fh = fopen(basketName, "r+");
>> >
>> > I was hoping someone would know how. My AFL routine
>> compares the real number of shares in my portfolio with the number of
>> shares in my basket file. I want to adjust the numbers in the
>> basketfile which is usually a small correction.
>> >
>> > Would you know how to do such a thing in AFL? Does AFL
>> also work with pointers?
>> >
>> > thanks, Ed
>> >
>> >
>> >
>> >
>> > ----- Original Message -----
>> > From: gp_sydney
>> > To: amibroker@xxxxxxxxxxxxxxx
>> > Sent: Sunday, July 22, 2007 4:43 PM
>> > Subject: [amibroker] Re: fopen
>> >
>> >
>> > Ed,
>> >
>> > Using fseek etc. to randomly access a file is only
>> useful if the data
>> > size stays exactly the same. For example, if you
>> wanted to replace 247
>> > with 2947 you'd have a problem because the replacement
>> is longer,
>> > which means the rest of the file would need to all be
>> moved down a
>> > character.
>> >
>> > The more common way to handle this is to effectively
>> copy the file to
>> > a new one and replace the values you want as you go.
>> That way the two
>> > files can end up different lengths.
>> >
>> > The way I'd typically do it would be:
>> >
>> > - Open the existing file with read access.
>> > - Create a new temporary file with write access.
>> > - Read from the existing and write to the new with
>> your modifications.
>> > - Close both files.
>> >
>> > If all that goes smoothly, then:
>> >
>> > - Delete the original file.
>> > - Rename the temporary file to the name of the
>> original one.
>> >
>> > For temporary files, I usually pick something like
>> $$MyTemp.$$$ as a
>> > filename to minimise the risk that the file might
>> exist already with
>> > something else in it, otherwise it would get deleted.
>> If you're really
>> > concerned about that, you can test for it by trying to
>> open the file
>> > first with read-only access. If the open fails, then
>> you know the file
>> > doesn't exist. If the open is successful though, then
>> it does (and
>> > should be closed again). Of course it could just be an
>> unwanted
>> > temporary file from a previous pass that never got
>> deleted for some
>> > reason, which is why I generally just pick a highly
>> unlikely name and
>> > don't even bother testing if it exists already.
>> >
>> > Regards,
>> > GP
>> >
>> > --- In amibroker@xxxxxxxxxxxxxxx, "Edward Pottasch"
>> <empottasch@>
>> > wrote:
>> > >
>> > > hi,
>> > >
>> > > I want to replace numbers inside a file. For
>> instance if I have a
>> > text file containing the lines:
>> > >
>> > > SELL, 247, JNS, STK, SMART, LMT, 32.05, 3,
>> > > SELL, 244, SIGM, STK, SMART, LMT, 34.15, 3,
>> > >
>> > > I want to replace 247 with 248 and 244 with 245.
>> > >
>> > > According to my latest information this should be
>> possible in
>> > Amibroker using fh = fopen(basketName, "r+");
>> > >
>> > > The C runtime library mode "r+"
>> > >
>> > > I have been looking for examples how to do such a
>> think in C. It
>> > seems that I will need additional functions like
>> rewind, fseek etc
>> > which do not seem available in AFL. I haven't got a
>> clue but it
>> > should be possible in AFL as well. Anyone with
>> experience in C would
>> > know how to do this?
>> > >
>> > > Below some code that reads a file containing the
>> lines I want to
>> > replace. Now I need additional code that does the
>> actual replacement.
>> > >
>> > > thanks, Ed
>> > >
>> > >
>> > >
>> > >
>> > > basketName = "C:\\tt.txt";
>> > >
>> > >
>> > > // open file
>> > > fh = fopen(basketName, "r+");
>> > >
>> > > if(fh) {
>> > >
>> > > while( !feof(fh )) {
>> > >
>> > > // format basket line: SELL, 100, CHRW, STK,
> SMART, LMT,
>> > 52.44, 1,
>> > > ss = fgets(fh);
>> > >
>> > > // string length
>> > > sl = StrLen(ss);
>> > > // storage array
>> > > strpos = 0;
>> > >
>> > > cnt = 0;
>> > > for (i=0; i<sl; i++) {
>> > >
>> > > if (StrMid(ss,i,1) == ",") {
>> > >
>> > > strpos[ cnt ] = i;
>> > > cnt = cnt + 1;
>> > >
>> > > }
>> > >
>> > > }
>> > >
>> > > // check if we did read a blank line
>> > > if (cnt > 0) {
>> > >
>> > > // extract action (BUY or SELL)
>> > > sp1 = strpos[ 0 ];
>> > > actn = StrMid(ss,0,sp1);
>> > >
>> > > // extract number of shares
>> > > sp2 = strpos[ 1 ];
>> > > nos = StrMid(ss,sp1 + 2, sp2 - sp1 - 2); nos =
>> StrToNum(nos);
>> > >
>> > > // extract ticker, e.g. CHRW
>> > > sp3 = strpos[ 2 ];
>> > > tckr = StrMid(ss,sp2 + 2,sp3 - sp2 - 2);
>> > >
>> > > // extract limit price
>> > > sp6 = strpos[ 5 ];
>> > > sp7 = strpos[ 6 ];
>> > > lprc = StrMid(ss,sp6 + 2,sp7 - sp6 - 2); lprc =
>> > StrToNum(lprc);
>> > >
>> > > // extract whether trade is (1) an entry order, (2)
>> an exit
>> > order, or (3) a profit stop order
>> > > sp7 = strpos[ 6 ];
>> > > sp8 = strpos[ 7 ];
>> > > ee = StrMid(ss,sp7 + 2,sp8 - sp7 - 2); ee =
>> StrToNum(ee);
>> > >
>> > >
>> > >
>> > > // construct new line
>> > > newl = actn + ", " + nos + ", " + tckr + ", " + "STK,
>> > SMART, LMT, " + ee + ",";
>> > >
>> > > }
>> > >
>> > > }
>> > >
>> > > fclose(fh);
>> > >
>> > > } else {
>> > >
>> > > printf("ERROR: file can not be found (does not
>> exist)");
>> > >
>> > > }
>> > >
>> >
>>
>
>
>
>
> Please note that this group is for discussion between users only.
>
> To get support from AmiBroker please send an e-mail directly to
> SUPPORT {at} amibroker.com
>
> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> http://www.amibroker.com/devlog/
>
> For other support material please check also:
> http://www.amibroker.com/support.html
>
> Yahoo! Groups Links
>
>
>
>
>
Please note that this group is for discussion between users only.
To get support from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
For other support material please check also:
http://www.amibroker.com/support.html
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/amibroker/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/amibroker/join
(Yahoo! ID required)
<*> To change settings via email:
mailto:amibroker-digest@xxxxxxxxxxxxxxx
mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx
<*> To unsubscribe from this group, send an email to:
amibroker-unsubscribe@xxxxxxxxxxxxxxx
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
|