digitalmars.D - Operate with void[]
- Sergey (19/19) Jan 14 2014 Hello!
- Adam D. Ruppe (2/2) Jan 14 2014 You can't really use void[] directly - cast it to ubyte[] then
- Sergey (3/5) Jan 14 2014 And then back to void[] write to a file?
- Adam D. Ruppe (13/14) Jan 14 2014 That's done automatically - any array will implicitly cast to
- Sergey (16/30) Jan 14 2014 So, please tell me how do I make replace:
- Adam D. Ruppe (8/9) Jan 14 2014 Try changing that line to this:
Hello! I have the following code: //-------------------------------- import std.stdio; import std.file; import std.array; int main(){ void[] str = std.file.read("some_file.txt"); writeln(str); // [32, 32, 55, 56, 9,10] // I'm looking for 10 and I change it to 9,9,9,10. // and I want to get this [32, 32, 55, 56, 9,9,9,9,10] std.file.write("some_file.txt", str2); return 0; } //-------------------------------- How do I operate with "str" to get the desired result? Thanks in advance. Regards, Sergey
Jan 14 2014
You can't really use void[] directly - cast it to ubyte[] then use it and you can write each index by byte.
Jan 14 2014
On Wednesday, 15 January 2014 at 02:56:01 UTC, Adam D. Ruppe wrote:You can't really use void[] directly - cast it to ubyte[] then use it and you can write each index by byte.And then back to void[] write to a file?
Jan 14 2014
On Wednesday, 15 January 2014 at 02:58:50 UTC, Sergey wrote:And then back to void[] write to a file?That's done automatically - any array will implicitly cast to const(void)[]. If you're writing a function that can take any kind of data, for example, std.file.write, it is nice to take a const void[] since then you can pass anything to it: write("myfile", "a string"); // ok write("myfile", [0, 1, 2,3]); // ok and so on. Going from void[] to any other array requires a cast, since it needs to know what kind of data you want to look at (void has no meaning itself, so indexing it would be nonsense), but going from something else to void happens implicitly.
Jan 14 2014
On Wednesday, 15 January 2014 at 03:11:27 UTC, Adam D. Ruppe wrote:On Wednesday, 15 January 2014 at 02:58:50 UTC, Sergey wrote:So, please tell me how do I make replace: //------------- import std.stdio; import std.file; import std.array; int main(){ auto fl_txt = "E:/hosp/TMP/file.TXT"; void[] str = std.file.read(fl_txt); ubyte[] pert = cast(ubyte[])str; str2[0] = replace(pert, [9], [9,9,10]); // ????????? std.file.write(fl_txt, pert); return 0; } //-------------And then back to void[] write to a file?That's done automatically - any array will implicitly cast to const(void)[]. If you're writing a function that can take any kind of data, for example, std.file.write, it is nice to take a const void[] since then you can pass anything to it: write("myfile", "a string"); // ok write("myfile", [0, 1, 2,3]); // ok and so on. Going from void[] to any other array requires a cast, since it needs to know what kind of data you want to look at (void has no meaning itself, so indexing it would be nonsense), but going from something else to void happens implicitly.
Jan 14 2014
On Wednesday, 15 January 2014 at 03:53:18 UTC, Sergey wrote:str2[0] = replace(pert, [9], [9,9,10]); // ?????????Try changing that line to this: pert = replace(pert, cast(ubyte[]) [9], cast(ubyte[]) [9,9,10]); There's no str2 variable, so I assigned to pert instead. I casted the other arrays to ubyte[] because otherwise it throws all kinds of errors about ints instead of bytes (number literals are ints and the replace function is a bit picky)
Jan 14 2014
On Wednesday, 15 January 2014 at 04:04:05 UTC, Adam D. Ruppe wrote:On Wednesday, 15 January 2014 at 03:53:18 UTC, Sergey wrote:Sorry, str2 is my mistake. And I think the last question: when the number of bytes with the number 9 is not known how to attach them? pert = replace(pert, cast(ubyte[]) [9], cast(ubyte[])[9] + ubyte[])[9] + ...n... + ubyte[])[10]);str2[0] = replace(pert, [9], [9,9,10]); // ?????????Try changing that line to this: pert = replace(pert, cast(ubyte[]) [9], cast(ubyte[]) [9,9,10]); There's no str2 variable, so I assigned to pert instead. I casted the other arrays to ubyte[] because otherwise it throws all kinds of errors about ints instead of bytes (number literals are ints and the replace function is a bit picky)
Jan 14 2014
On Wednesday, 15 January 2014 at 05:21:26 UTC, Sergey wrote:On Wednesday, 15 January 2014 at 04:04:05 UTC, Adam D. Ruppe wrote:again sorry....:))) some_ubyte = some_ubyte ~ cast(ubyte[])[9]On Wednesday, 15 January 2014 at 03:53:18 UTC, Sergey wrote:Sorry, str2 is my mistake. And I think the last question: when the number of bytes with the number 9 is not known how to attach them? pert = replace(pert, cast(ubyte[]) [9], cast(ubyte[])[9] + ubyte[])[9] + ...n... + ubyte[])[10]);str2[0] = replace(pert, [9], [9,9,10]); // ?????????Try changing that line to this: pert = replace(pert, cast(ubyte[]) [9], cast(ubyte[]) [9,9,10]); There's no str2 variable, so I assigned to pert instead. I casted the other arrays to ubyte[] because otherwise it throws all kinds of errors about ints instead of bytes (number literals are ints and the replace function is a bit picky)
Jan 14 2014