Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Why can't use fgetc() in SWITCH with CASE?

114 views
Skip to first unread message

kuoya...@gmail.com

unread,
Nov 17, 2013, 1:49:39 AM11/17/13
to
I write a program and want to get the byte 30 & 31 from file4 (file4 name came from "Ext_001"), the program will stop at "IWLo = fgetc(file4);", the final output is show "printf("Check point 1 ...\n");", I don't know Why?

char IWHi, IWLo; //I tried use int IWHi, IWLo; same result
int ImgLenHi, ImgLenLo;
int FCount = 1, R200=0, R300=0, Rot=0;
int Res;
FILE *file3 = fopen(FN_OK,"r");
if ( file3 != NULL )
{
printf ("Found : %s\n",FN_OK);
fclose(file3);
for (FCount; FCount <=3; FCount++)
{
switch (FCount)
{
// case (2):
//
// break;
// case (3):
//
// break;
// case (4):
//
// break;
default:
strcat (Ext_001,FN_999);
strcat (Ext_001,"_001.tif");
printf("getfileHHMMSS_001.tif = %s\n",Ext_001);
FILE *file4 = fopen(Ext_001,"r");
if ( file4 != NULL )
{
printf("Open getfileHHMMSS_001.tif = %s.\n",Ext_001);
if (fseek(file4,0,SEEK_SET) == 0)
{
if (fseek(file4,30,SEEK_SET) == 0)
{
printf("Check point 1 ...\n");
IWLo = fgetc(file4);
//printf("IWLo = %X",ImgWidthLo);
fclose(file4);
}
}
fclose(file4);
}
break;
}
}

return 0;
}

BartC

unread,
Nov 17, 2013, 4:12:01 AM11/17/13
to
<kuoya...@gmail.com> wrote in message
news:6c6323de-2746-4175...@googlegroups.com...
> I write a program and want to get the byte 30 & 31 from file4 (file4 name
> came from "Ext_001"), the program will stop at "IWLo = fgetc(file4);", the
> final output is show "printf("Check point 1 ...\n");", I don't know Why?

(I've had to alter the indents which were causing some grief to my email
program.)

> FILE *file4 = fopen(Ext_001,"r");
> if ( file4 != NULL )
> {
> printf("Open getfileHHMMSS_001.tif = %s.\n",Ext_001);
> if (fseek(file4,0,SEEK_SET) == 0)
> {
> if (fseek(file4,30,SEEK_SET) == 0)
> {
> printf("Check point 1 ...\n");
> IWLo = fgetc(file4);
> //printf("IWLo = %X",ImgWidthLo);

What happens when you uncomment this line?

> fclose(file4);
> }
> }
> fclose(file4);

You appear to be closing the file a second time here (once it's been closed
above)

--
Bartc

kuoya...@gmail.com

unread,
Nov 17, 2013, 4:48:12 AM11/17/13
to
kuoya...@gmail.com於 2013年11月17日星期日UTC+8下午2時49分39秒寫道:
Hi Bart,

1. If I comment "IWLo = fgetc(file4);", the program could normally end.
2. If I comment or uncomment "fclose(file4);" under "//printf("IWLo = %X",ImgWidthLo); I got same fault result.
3. I checked several times, the program is terminated when DOS windows showed "Check point 1 ..." then Win7 show "error windows and try find suitable resolution", unfortunately I have to interrupt it by manually.

Kuoyang

BartC

unread,
Nov 17, 2013, 5:04:12 AM11/17/13
to
<kuoya...@gmail.com> wrote in message
news:2ffc12d7-fa3c-4260...@googlegroups.com...

>> strcat (Ext_001,FN_999);
>>
>> strcat
>> (Ext_001,"_001.tif");
>>
>>
>> printf("getfileHHMMSS_001.tif = %s\n",Ext_001);
>>
>> FILE *file4 =
>> fopen(Ext_001,"r");


> 1. If I comment "IWLo = fgetc(file4);", the program could normally end.
> 2. If I comment or uncomment "fclose(file4);" under "//printf("IWLo =
> %X",ImgWidthLo); I got same fault result.
> 3. I checked several times, the program is terminated when DOS windows
> showed "Check point 1 ..." then Win7 show "error windows and try find
> suitable resolution", unfortunately I have to interrupt it by manually.

OK, find out exactly what the name of the file is. Hard-code that into the
fopen() function (and comment out all the stuff to with Ext_001, as we can't
see the definition of that, how it's initialised, or whether it's big enough
to contain the filename).

If that still goes wrong, just extract this bit of code (open the file, seek
to 0, seek to 30, fgetc etc) into its own program, and out of the
dodgy-looking loop and switch statements (eg. case(4)?).

--
Bartc

kuoya...@gmail.com

unread,
Nov 17, 2013, 6:57:22 AM11/17/13
to
kuoya...@gmail.com於 2013年11月17日星期日UTC+8下午2時49分39秒寫道:
Hi Bart,

1. The Ext_001 definition is "char Ext_001[256];"
2. I changed the "char Ext_001[256];" to "char Ext_001[384];". I got same result.
3. I changed the "char Ext_001[256];" to "char Ext_001[512];". I got follow result:
======== Show on DOS Windows ==========
Found : d:\mtif2stif\transout\gotfile195041.ok <-- This is file that I want to check.
getfileHHMMSS_001.tif = 翂:\mtif2stif\transout\gotfile195041_001.tif
========================================
I got a dummy character before ":\mtif2stif\transout\gotfile195041_001.tif". The dummy character shall be "d:".
Shall I have to initialise my Ext_001[512]? If yes, how to do?

I try to fix this question over two days and can you help me?

Kuoyang

Fuseblower

unread,
Nov 17, 2013, 7:19:16 AM11/17/13
to
On Sat, 16 Nov 2013 22:49:39 -0800 (PST), kuoya...@gmail.com wrote:

> FILE *file4 = fopen(Ext_001,"r");

Hello, you're obviously reading a tiff file but you open it as a text
file.

Use fopen(Ext_001, "rb").

Note the use of "rb" instead of "r". This will open the file as a
binary stream instead of as a text stream.

Furthermore : if you're writing a tiff reader then I'd suggest you
simply read in the entire file in memory and work with that instead of
reading a single byte at a time.

BartC

unread,
Nov 17, 2013, 7:24:33 AM11/17/13
to
<kuoya...@gmail.com> wrote in message
news:eb837e82-08d4-4dcd...@googlegroups.com...


> 1. The Ext_001 definition is "char Ext_001[256];"
> 2. I changed the "char Ext_001[256];" to "char Ext_001[384];". I got same
> result.
> 3. I changed the "char Ext_001[256];" to "char Ext_001[512];". I got
> follow result:
> ======== Show on DOS Windows ==========
> Found : d:\mtif2stif\transout\gotfile195041.ok <-- This is file that I
> want to check.
> getfileHHMMSS_001.tif = 翂:\mtif2stif\transout\gotfile195041_001.tif
> ========================================
> I got a dummy character before
> ":\mtif2stif\transout\gotfile195041_001.tif". The dummy character shall be
> "d:".
> Shall I have to initialise my Ext_001[512]? If yes, how to do?

Ext_001 should be initialised to "" or {0} if you're going to use strcat()
on it first (otherwise replace the first strcat by strcpy). The size seems
fine.

I put together this minimal program:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
int I;
FILE *file4 = fopen("testfile","r");
if (file4 != NULL)
{
printf("One %s\n","abcdef");
if (fseek(file4,0,SEEK_SET) == 0)
{
if (fseek(file4,30,SEEK_SET) == 0)
{
printf("Two\n");
I = fgetc(file4);
printf("Three\n");
fclose(file4);
}
}
fclose(file4);
}
}

That appears to work (in that it doesn't hang at the fgetc() call.) (The
unnecessary extra fclose is still there, althought it's probably not causing
your error.) My suggestion was that you did something similar, and if it
worked, to gradually add in more of your original program until the error
shows up.

You might also like to copy the contents of that complicated file to a local
file with an easier name that you can just give to fopen, which will at
least eliminate that as a possible source of the problem.

--
Bartc

kuoya...@gmail.com

unread,
Nov 17, 2013, 8:06:39 AM11/17/13
to
kuoya...@gmail.com於 2013年11月17日星期日UTC+8下午2時49分39秒寫道:
I changed follow:

char Ext_001[512];
:
strcpy (Ext_001,FN_999);
strcat (Ext_001,"_001.tif");
printf("getfileHHMMSS_001.tif = %s\n",Ext_001);
FILE *file4 = fopen(Ext_001,"rb");
if ( file4 != NULL )
{
printf("Open getfileHHMMSS_001.tif = %s.\n",Ext_001);
if (fseek(file4,0,SEEK_SET) == 0)
{
if (fseek(file4,30,SEEK_SET) == 0)
{
printf("Check point 1 ...\n");
IWLo = fgetc(file4);
printf("IWLo = %X",IWLo);
fclose(file4);
}
}
// fclose(file4);

Sometimes (20%) OK (Showed "IWLo = FFFFFFD9"), sometimes (80%) failed.
I using development tool is a "Dev-C++4.9.9.2"). Is it question at "Dev-C++4.9.9.2"? I am very confuse.

Kuoyang

Ben Bacarisse

unread,
Nov 17, 2013, 8:30:25 AM11/17/13
to
kuoya...@gmail.com writes:

<snip>
> I changed follow:
>
> char Ext_001[512];
> :
> strcpy (Ext_001,FN_999);
> strcat (Ext_001,"_001.tif");
> printf("getfileHHMMSS_001.tif = %s\n",Ext_001);
> FILE *file4 = fopen(Ext_001,"rb");
> if ( file4 != NULL )
> {
> printf("Open getfileHHMMSS_001.tif = %s.\n",Ext_001);
> if (fseek(file4,0,SEEK_SET) == 0)

What is the purpose of this seek operation?

> {
> if (fseek(file4,30,SEEK_SET) == 0)
> {
> printf("Check point 1 ...\n");
> IWLo = fgetc(file4);
> printf("IWLo = %X",IWLo);

You should add \n at the of the format. Without it, you can't be 100%
that you'll see the data if this is the last output operation to occur.

> fclose(file4);

This is the fclose you should remove.

> }
> }
> // fclose(file4);

This one should stay: if the file gets opened, it should be closed.

> Sometimes (20%) OK (Showed "IWLo = FFFFFFD9"), sometimes (80%) failed.

Try to write the smallest complete program that still exhibits the
problem.

> I using development tool is a "Dev-C++4.9.9.2"). Is it question at
> "Dev-C++4.9.9.2"? I am very confuse.

You have to rule out every other possibility first, and only you have
ever seen the whole program. As I say, try to get the smallest complete
program that show this problem. You may find that just trying to do
that reveals what's going on.

--
Ben.

Fuseblower

unread,
Nov 17, 2013, 10:48:44 AM11/17/13
to
On Sun, 17 Nov 2013 05:06:39 -0800 (PST), kuoya...@gmail.com wrote:

>> char IWHi, IWLo; //I tried use int IWHi, IWLo; same result

...

> IWLo = fgetc(file4);
> printf("IWLo = %X",IWLo);

...

>Sometimes (20%) OK (Showed "IWLo = FFFFFFD9"), sometimes (80%) failed.

Change IWLo back to int, it *will* make a difference.

The function fgetc() returns int.It reads an unsigned char from the
stream and casts that to int, returning that result.

But you assign the return value of fgetc() to IWLo which is of type
char. And char is typically signed! (it's actually a setting but in
most cases char is signed)

If you use "%X" in the format string of printf() then an argument of
type int is expected (I believe it expects an unsigned int).

So : change the type of IWLo back to int.

The reason why it shows "FFFFFFD9" is because of the implict casts in
your code.

Assume fgetc(file4) returns an int with the value 255 (which is 0xFF
in hexadecimal notation).

You put that value in a (signed) char. As such it will be interpreted
as -1 instead of 255 (given 2's complement, of course). The difference
between an unsigned and a signed char will show if you assign it to a
bigger signed type like int.

For example :

unsigned char a = 0xFF;
int b;

b = a; // b will be 255
b = (char)a; // b will be 0xFFFFFFFF

(The above assumes 2's complement and an int of 32 bits)


Phil Carmody

unread,
Nov 17, 2013, 11:34:43 AM11/17/13
to
Fuseblower <gnomefir...@xs4all.nl> writes:
> For example :
>
> unsigned char a = 0xFF;
> int b;
>
> b = a; // b will be 255
> b = (char)a; // b will be 0xFFFFFFFF
>
> (The above assumes 2's complement and an int of 32 bits)

And a whole lot else. Such as char being signed. And the cast,
being implementation-defined behaviour, actually yields -1.

And saying that an 32-bit 2's complement int will be an
expression that represents an unsigned int is more than
a little dodgy.

Phil
--
The list of trusted root authorities in your browser included the
United Arab Emirates-based Etisalat, which was caught secretly
uploading spyware onto 100,000 customers' BlackBerries.
http://www.wired.com/threatlevel/2009/07/blackberry-spies/

Fuseblower

unread,
Nov 17, 2013, 12:31:48 PM11/17/13
to
On 17 Nov 2013 18:34:43 +0200, Phil Carmody
<thefatphi...@yahoo.co.uk> wrote:

>Fuseblower <gnomefir...@xs4all.nl> writes:
>> For example :
>>
>> unsigned char a = 0xFF;
>> int b;
>>
>> b = a; // b will be 255
>> b = (char)a; // b will be 0xFFFFFFFF
>>
>> (The above assumes 2's complement and an int of 32 bits)
>
>And a whole lot else. Such as char being signed.

Well, I mentioned that earlier in my response (char being "usually"
signed but its "signedness" is really a setting of the compiler).

> And the cast,
>being implementation-defined behaviour, actually yields -1.

Oh darn! You're right. It's in 6.2.1.2 (of C90)

...

When a value with integral type is demoted to a signed integer with
smaller size, *OR* an unsigned integer is converted to its
corresponding signed integer, if the value cannot be represented the
result is implementation-defined.

....

Well.... hehe... it works on my machine...

*poof*

(sound of Fuseblower making a quick getaway to hide under a rock in
shame for the next couple of years)

kuoya...@gmail.com

unread,
Nov 18, 2013, 4:47:19 AM11/18/13
to
kuoya...@gmail.com於 2013年11月17日星期日UTC+8下午2時49分39秒寫道:
I wrote a simple program to test the switch command with FILE (called file3 & file4). If I put the "file4" out of "switch" command, compiler OK & executable. If I put the "file4" after the "switch" command, compiler fail & couldn't generate execute file.

Below is my simple test program.
#include <stdio.h>
#include <string.h>
#include <time.h>

main ()
{
char Ext_001[512];
int IWHi, IWLo;
int ImgLenHi, ImgLenLo;
int FCount = 1, R200=0, R300=0, Rot=0;
int Res;
FILE *file3 = fopen("d:\\mtif2stif\\transout\\ORGgotfile21381.ok","rb");
FILE *file4 = fopen("d:\\mtif2stif\\transout\\ORGgotfile21381_001.tif","rb"); //Put here compiler OK & execuateable
if ( file3 != NULL )
{
printf ("Found : d:\\mtif2stif\\transout\\gotfile21381.ok\n");
fclose(file3);
for (FCount; FCount <=3; FCount++)
{
switch (FCount)
{
case 1:
break;
default:
// FILE *file4 = fopen("d:\\mtif2stif\\transout \\ORGgotfile21381_001.tif","rb"); //Put here compiler failed
if ( file4 != NULL )
{
printf("Open getfileHHMMSS_001.tif\n");
if (fseek(file4,0,SEEK_SET) == 0)
{
if (fseek(file4,31,SEEK_SET) == 0)
{
printf("Check point 1 ...\n");
IWLo = fgetc(file4);
printf("IWLo = %X\n",IWLo);
fclose(file4);
}
}
fclose(file4);
}
break;
}
}
return 0;
}
printf("Can't open file\n");
return 0;
}

BartC

unread,
Nov 18, 2013, 5:46:18 AM11/18/13
to


<kuoya...@gmail.com> wrote in message
news:7ec201b1-99ec-4777...@googlegroups.com...


> I wrote a simple program to test the switch command with FILE (called
> file3 & file4). If I put the "file4" out of "switch" command, compiler OK
> & executable. If I put the "file4" after the "switch" command, compiler
> fail & couldn't generate execute file.

> FILE *file4 =
> fopen("d:\\mtif2stif\\transout\\ORGgotfile21381_001.tif","rb"); //Put here
> compiler OK & execuateable

> default:
> // FILE *file4 = fopen("d:\\mtif2stif\\transout
> \\ORGgotfile21381_001.tif","rb"); //Put here compiler

I get: "a label can only be part of a statement and a declaration is not a
statement", which is self-explanatory.

But that's a minor matter: put FILE *file4; at the top, and the assignment
file4=fopen... here. Or put {...} braces around all the code comprising your
'default' section (then default: is followed by a block statement and will
shut the compiler up).

Does the positioning of this declaration/assignment affect your original
problem?

--
Bartc





kuoya...@gmail.com

unread,
Nov 18, 2013, 9:45:50 AM11/18/13
to
kuoya...@gmail.com於 2013年11月17日星期日UTC+8下午2時49分39秒寫道:
Hi Bartc,

No. I still can't solve my original program, but I decide to change my program process. I can generate the "getfilehhmmss_nnn.tif" from the original program and send this file to my another program as a argv, maybe I can keep going. I am not a professional program designer, I never using C over 10 years.

Thank all of guy kindly support me. I don't know you, but I am very thanks all of you.

Kuoyang

Barry Schwarz

unread,
Nov 18, 2013, 2:28:27 PM11/18/13
to
On Mon, 18 Nov 2013 01:47:19 -0800 (PST), kuoya...@gmail.com wrote:


< snip 100 lines of obsolete code>

>
>I wrote a simple program to test the switch command with FILE (called file3 & file4). If I put the "file4" out of "switch" command, compiler OK & executable. If I put the "file4" after the "switch" command, compiler fail & couldn't generate execute file.

More people might be willing to help if you deleted unneeded text from
you message and limited you line length to something less than 80.

Since you seem unwilling to tell us what the error message is, one
might think you are not really interested in solving the problem. This
is reinforced since you have not corrected any of the errors you were
previously told about (e.g., you are still closing file 4 twice).
--
Remove del for email
0 new messages