| Bill Allombert on Fri, 04 Nov 2016 15:55:42 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Windows gp64 writebin creates unreadable file for \p174 |
On Tue, Nov 01, 2016 at 02:38:27PM +0000, Jacques Gélinas wrote:
> 1. On my laptop running Windows 8.1-64 and Pari 2.7-64 or 2.8-64,
> binary files become unreadable if reals use 10 words or more.
>
> GP/PARI CALCULATOR Version 2.8.1 (beta)
> amd64 running mingw (x86-64/GMP-6.0.0 kernel) 64-bit version
>
> \\---------------------------------------start copy
>
> default(secure,0)
>
> \p173
> \\ realprecision = 173 significant digits
> #1.
> \\ 9
> writebin("173-lg2",log(2));log(2)==read("173-lg2")
> \\ 1
>
> \p174
> \\ realprecision = 192 significant digits (174 digits displayed)
> #1.
> \\ 10
> writebin("174-7",1/7.);1/7.==read("174-7")
> \\ 1
> writebin("174-lg2",log(2));log(2)==read("174-lg2")
> \\ *** at top-level: ...174-lg2",log(2));log(2)==read("174-lg2")
> \\ *** ^---------------
> \\ *** read: error opening input file [fread]: `FILE*'.
The issue is that fread is doing some CR/LF conversion.
We should use fopen(,"rb").
The attached patch seems to fix this bug.
Maybe there is a better place to set the b flag.
Thanks for reporting this!
Bill.
diff --git a/src/language/es.c b/src/language/es.c
index 0a28371..e399b6d 100644
--- a/src/language/es.c
+++ b/src/language/es.c
@@ -3990,7 +3990,7 @@ pari_fopengz(const char *s)
static FILE*
try_open(char *s)
{
- if (!pari_is_dir(s)) return fopen(s, "r");
+ if (!pari_is_dir(s)) return fopen(s, "rb");
pari_warn(warner,"skipping directory %s",s);
return NULL;
}
@@ -4411,7 +4411,7 @@ file_is_binary(FILE *f)
void
writebin(const char *name, GEN x)
{
- FILE *f = fopen(name,"r");
+ FILE *f = fopen(name,"rb");
pari_sp av = avma;
GEN V;
int already = f? 1: 0;
@@ -4421,7 +4421,7 @@ writebin(const char *name, GEN x)
fclose(f);
if (!ok) pari_err_FILE("binary output file",name);
}
- f = fopen(name,"a");
+ f = fopen(name,"ab");
if (!f) pari_err_FILE("binary output file",name);
if (!already) write_magic(f);