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)");
>
>
}
>