On Nov 10, 3:50 am, Timothy Madden <terminato...@gmail.com> wrote:
> [cross-posted to comp.lang.c, comp.lang.c++]
> Hello
>
> I see there is now why to truncate a file (in C or C++)
> and that I have to use platform-specific functions for
> truncating files.
There are ways.
int trunc(const char *file, size_t newsize) {
FILE *fp;
void *p = NULL;
if(newsize) {
fp = fopen(file, "rb");
if(fp == NULL) return 1;
p = malloc(newsize);
if(p == NULL) { fclose(fp); return 1; } /* errno may be lost and
the user will get a misleading error message */
if(fread(p, 1, newsize, fp) != newsize) { fclose(fp); return
1; } /* ditto */
fclose(fp);
}
fp = fopen(file, "wb");
if(fp == NULL) {
free(p);
return 1;
}
if(newsize) if(fwrite(p, 1, newsize, fp) != newsize) { free(p);
fclose(fp); return 1; } /* ditto */
free(p);
return fclose(fp) == EOF;
}
}
> Anyone knows why ? I mean C/C++ evolved over many years now,
> and still, people making _the_ standards never decided to
> include such a function. Even in POSIX it was included only
> in recent versions, mostly not fully supported yet.
>
> Why is that ? They must think there is something wrong with it,
> or that there are better ways to do it.
You're right. There is something wrong with it, that some platforms
that support C do not support file truncating (hell, some might not
even support file operations at all). There are better ways, to use a
more specific standard like POSIX.
|