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@xxxxxxxxxps.com,
"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)");
>
>
}
>