fgets() writes a NUL byte after the last byte read, so this will
segfault if the file is longer than 254 bytes.
As a general rule when dealing with the string functions of the C
library: Be very careful with those NUL terminators and buffer size
limits…
//David Olofson - Programmer, Composer, Open Source Advocate
Perhaps make sure (fin != NULL) after the fopen() call?
This doesn’t look like an SDL bug.
–ryan.
Thanks David (and Ryan ^_^) for your help
(i konw that i’should use a dynamic assignment) but …
if i comment (or delete) the SDL initialization,
my code don’t goes in Segmentation;
if you try (even adding a printf("%d\n",mdl->vtx_num)
to see if “all” indeed works) it works …
thanks in advance,
(i’m really really sorry for my english …
i hope that you understand what i’m trying to say)
fgets() writes a NUL byte after the last byte read, so this will
segfault if the file is longer than 254 bytes.
As a general rule when dealing with the string functions of the C
library: Be very careful with those NUL terminators and buffer size
limits…
//David Olofson - Programmer, Composer, Open Source Advocate
Perhaps make sure (fin != NULL) after the fopen() call?
This doesn’t look like an SDL bug.
–ryan.
Thanks David (and Ryan ^_^) for your help
(i konw that i’should use a dynamic assignment) but …
if i comment (or delete) the SDL initialization,
my code don’t goes in Segmentation;
if you try (even adding a printf("%d\n",mdl->vtx_num)
to see if “all” indeed works) it works …
thanks in advance,
(i’m really really sorry for my english …
i hope that you understand what i’m trying to say)
fgets() writes a NUL byte after the last byte read, so this will
segfault if the file is longer than 254 bytes.
As a general rule when dealing with the string functions of the C
library: Be very careful with those NUL terminators and buffer
size
limits…
//David Olofson - Programmer, Composer, Open Source Advocate
Perhaps make sure (fin != NULL) after the fopen() call?
This doesn’t look like an SDL bug.
–ryan.
Thanks David (and Ryan ^_^) for your help
(i konw that i’should use a dynamic assignment) but …
if i comment (or delete) the SDL initialization,
my code don’t goes in Segmentation;
if you try (even adding a printf("%d\n",mdl->vtx_num)
to see if “all” indeed works) it works …
Coincidence. Two things happen when you init SDL:
1) Code changes and moves around, so things that slips
through otherwise doesn’t, and vice versa.
2) SDL catches the segmentation fault, so it has
a chance of closing the display and stuff.
(Certain platforms will sometimes kill the
display, or worse, if an application dies
without closing it’s fullscreen display…)
That is, when not initializing SDL, your code somehow manages to get
away with illegal memory accesses (ie they hit some unused memory
area, as opposed to hitting unmapped addresses) - or it would have
crashed anyway; it would just have been handled by the operating
system instead of SDL.
Try adding SDL_INIT_NOPARACHUTE to SDL_Init() to have a normal crasch
instead, or more interestingly, allow a debugger to trap the
segfault.
//David Olofson - Programmer, Composer, Open Source Advocate
Sorry to bring this back up, but I want to clarify this fgets bit…On 1/8/06, David Olofson wrote:
(This is not SDL related, but anyway…)
On Sunday 08 January 2006 20:07, Ivan wrote:
[…]
char string[255];
[…]
while(fgets(string,255,fin)!=NULL){
fgets() writes a NUL byte after the last byte read, so this will
segfault if the file is longer than 254 bytes.
According to Borland (C++ Builder 6) docs, fgets will stop after
reading n-1 bytes, leaving room for its null terminator itself. It
wouldn’t segfault if the line was longer than 254 bytes, it would just
stop reading at that point. Are there other compilers where this
behavior is different? I’m using fgets for some of the data I load,
and I can always just make a bigger buffer, but it’d be easier to do
it right the first time.
Sorry to bring this back up, but I want to clarify this fgets bit…
(This is not SDL related, but anyway…)
[…]
char string[255];
[…]
while(fgets(string,255,fin)!=NULL){
fgets() writes a NUL byte after the last byte read, so this will
segfault if the file is longer than 254 bytes.
According to Borland (C++ Builder 6) docs, fgets will stop after
reading n-1 bytes, leaving room for its null terminator itself. It
wouldn’t segfault if the line was longer than 254 bytes, it would just
stop reading at that point. Are there other compilers where this
behavior is different? I’m using fgets for some of the data I load,
and I can always just make a bigger buffer, but it’d be easier to do
it right the first time.
-Justin
anyway,
i was looking around for tutorial to read obj
files and i’ve seen that *, NeHe in a tutorial
use something like my function, maybe (as someone has advised)
the problem is the overriding of the function read().
Sorry to bring this back up, but I want to clarify this fgets bit…
(This is not SDL related, but anyway…)
[…]
char string[255];
[…]
while(fgets(string,255,fin)!=NULL){
fgets() writes a NUL byte after the last byte read, so this will
segfault if the file is longer than 254 bytes.
According to Borland (C++ Builder 6) docs, fgets will stop after
reading n-1 bytes, leaving room for its null terminator itself. It
wouldn’t segfault if the line was longer than 254 bytes, it would
just stop reading at that point. Are there other compilers where
this behavior is different? I’m using fgets for some of the data I
load, and I can always just make a bigger buffer, but it’d be easier
to do it right the first time.
I was wondering why that was not totally clear in the Linux
documentation - but it turns out it is; I just didn’t read it
carefully enough:
"fgets() reads in at most one less than size characters
from stream and stores them into the buffer
pointed to by s. Reading stops after an EOF or a
newline. If a newline is read, it is stored into the
buffer. A '\0' is stored after the last character in
the buffer."
So, no, fgets() won’t write more than ‘size’ bytes. I certainly hope
this applies to all other relevant implementations as well…
//David Olofson - Programmer, Composer, Open Source Advocate