Unable to open filename passed as command line argument
drug
drug2004 at bk.ru
Thu Sep 3 11:04:33 UTC 2020
On 9/3/20 1:47 PM, Curious wrote:
> Given the following:
>
> =====a======
> void main(string[] args)
> {
> FILE* fp = fopen(args[1].ptr, "r");
> if (!fp) throw new Exception("fopen");
> }
>
> =====b======
> void main(string[] args)
> {
> FILE* fp = fopen(args[1].dup.ptr, "r");
> if (!fp) throw new Exception("fopen");
> }
>
> Why does a fail but b succeed?
try `toStringz`:
```D
import std.string : toStringz;
void main(string[] args)
{
FILE* fp = fopen(args[1].toStringz, "r");
if (!fp) throw new Exception("fopen");
}
```
The reason is that args are D strings (that contains no terminating 0)
but `fopen` gets C string (null terminated) so your `a` variant fails
because the filename becomes wrong as there is no terminating 0. Your
`b` variant works in fact accidentally because after duplication in new
memory after filename 0 appears due to random reason (for example all
that memory area zeroed by allocator).
More information about the Digitalmars-d-learn
mailing list