472,958 Members | 2,662 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,958 software developers and data experts.

read int(long) from a file

*** post for FREE via your newsreader at post.newsfeed.com ***

Dear all,

I have a file it's binary data viewed in UltraEdit is
EF BB BF 0D 0A 3C .......
I want to read them into a int or long int array byte[]
for example:
byte[0]=0xEFBB
byte[1]=0xBF0D

I write the following code, but the output isn't right:

/* ---------------code --------------- */

char dictfilename[256]="test.txt";
FILE *dictfile;
struct stat stats;

dictfile = fopen(dictfilename,"rb");
if (stat (dictfilename, &stats) == -1)
{
printf("dict file not exist!\n");
return 0;
}

int buffer[256]={1,2,3,4,5,6,7,8,9};

fread (buffer, sizeof(int), 256, dictfile);
fclose (dictfile);
for(int i=0; i<16; ++i)
printf("0xd%",buffer[i]);

/* ---------- end of the code ---------- */

the output is :
0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd

Is my code right?
It seems fread didn't read anything into buffer[]

Thank you for your help!
Lingyun Yang


-----= Posted via Newsfeed.Com, Uncensored Usenet News =-----
http://www.newsfeed.com - The #1 Newsgroup Service in the World!
-----== 100,000 Groups! - 19 Servers! - Unlimited Download! =-----

Nov 14 '05 #1
4 8573
Lingyun Yang wrote:
*** post for FREE via your newsreader at post.newsfeed.com ***

Dear all,

I have a file it's binary data viewed in UltraEdit is
EF BB BF 0D 0A 3C .......
I want to read them into a int or long int array byte[]
for example:
byte[0]=0xEFBB
byte[1]=0xBF0D

I write the following code, but the output isn't right:

/* ---------------code --------------- */

char dictfilename[256]="test.txt";
FILE *dictfile;
struct stat stats;

dictfile = fopen(dictfilename,"rb");
if (stat (dictfilename, &stats) == -1)
{
printf("dict file not exist!\n");
return 0;
}

int buffer[256]={1,2,3,4,5,6,7,8,9};

fread (buffer, sizeof(int), 256, dictfile);
fclose (dictfile);
for(int i=0; i<16; ++i)
printf("0xd%",buffer[i]);

/* ---------- end of the code ---------- */

the output is :
0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd0xd

Is my code right?


No. Hell, it isn't even compilable. And even if you turn it into a
program, stat() is not a standard function. Here's some code for you to
play with:

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

int main(void)
{
FILE *inout;
const unsigned char outdata[] =
{ 0xef, 0xbb, 0xbf, 0x0d, 0x0a, 0x3c };
/* Any of the following may lead to a zero-size array, which is not
legal C. I could do the checks at runtime, but I have left the
possibly illegal code, with a chicken-ass runtime check. */
unsigned short xshrt[sizeof outdata / sizeof(short)];
unsigned long xlong[sizeof outdata / sizeof(long)];
unsigned long long xllng[sizeof outdata / sizeof(long long)];
size_t i, Transfered;

if (!(inout = fopen("testdata", "wb"))) {
printf("could not open 'testdata' for outout\n");
exit(EXIT_FAILURE);
}

Transfered =
fwrite(outdata, sizeof *outdata,
sizeof outdata / sizeof *outdata, inout);
printf("Output transfer was %lu units of %lu bytes (wanted %lu)\n",
(unsigned long) Transfered, (unsigned long) sizeof *outdata,
(unsigned long) (sizeof outdata / sizeof *outdata));
fclose(inout);

if (sizeof outdata != sizeof xshrt) {
printf("There is a problem with reading into shorts.\n");
exit(EXIT_FAILURE);
}
if (!(inout = fopen("testdata", "rb"))) {
printf("could not open 'testdata' for outout\n");
exit(EXIT_FAILURE);
}
Transfered =
fread(xshrt, sizeof *xshrt,
sizeof xshrt / sizeof *xshrt, inout);
printf("Input transfer was %lu units of %lu bytes (wanted %lu)\n",
(unsigned short) Transfered, (unsigned short) sizeof *xshrt,
(unsigned short) (sizeof xshrt / sizeof *xshrt));
fclose(inout);
printf("Unsigned shorts: ");
for (i = 0; i < sizeof xshrt / sizeof *xshrt; i++)
printf("%#hx ", (unsigned short) xshrt[i]);
printf("\n\n");

if (sizeof outdata != sizeof xlong) {
printf("There is a problem with reading into longs.\n");
exit(EXIT_FAILURE);
}
if (!(inout = fopen("testdata", "rb"))) {
printf("could not open 'testdata' for outout\n");
exit(EXIT_FAILURE);
}
Transfered =
fread(xlong, sizeof *xlong,
sizeof xlong / sizeof *xlong, inout);
printf("Input transfer was %lu units of %lu bytes (wanted %lu)\n",
(unsigned long) Transfered, (unsigned long) sizeof *xlong,
(unsigned long) (sizeof xlong / sizeof *xlong));
fclose(inout);
printf("Unsigned shorts: ");
for (i = 0; i < sizeof xlong / sizeof *xlong; i++)
printf("%#lx ", xlong[i]);
printf("\n\n");
if (sizeof outdata != sizeof xllng) {
printf("There is a problem with reading into long longs.\n");
exit(EXIT_FAILURE);
}
if (!(inout = fopen("testdata", "rb"))) {
printf("could not open 'testdata' for outout\n");
exit(EXIT_FAILURE);
}
Transfered =
fread(xllng, sizeof *xllng,
sizeof xllng / sizeof *xllng, inout);
printf("Input transfer was %lu units of %lu bytes (wanted %lu)\n",
(unsigned long long) Transfered,
(unsigned long long) sizeof *xllng,
(unsigned long long) (sizeof xllng / sizeof *xllng));
fclose(inout);
printf("Unsigned shorts: ");
for (i = 0; i < sizeof xllng / sizeof *xllng; i++)
printf("%#llx ", xllng[i]);
printf("\n\n");
return 0;
}

[output]
Output transfer was 6 units of 1 bytes (wanted 6)
Input transfer was 3 units of 2 bytes (wanted 3)
Unsigned shorts: 0xbbef 0xdbf 0x3c0a

There is a problem with reading into longs.


--
Martin Ambuhl
Nov 14 '05 #2
Martin Ambuhl wrote [code that had many typos and errors]

Please ignore that code, except, possibly, to fix it. I have sent a
cancel, but those are largely ignored since the days of the rogue cancelbots.

--
Martin Ambuhl
Nov 14 '05 #3
In 'comp.lang.c', "Lingyun Yang" <yz***@etang.com> wrote:
*** post for FREE via your newsreader at post.newsfeed.com ***

Dear all,

I have a file it's binary data viewed in UltraEdit is
EF BB BF 0D 0A 3C .......
I want to read them into a int or long int array byte[]
It makes a difference. Be more informative.

The id 'byte' is inappropriate here. A 'byte' is the smallest addressable
amount of memory for a given platform.
for example:
byte[0]=0xEFBB
byte[1]=0xBF0D I write the following code, but the output isn't right:
Your code is very broken.
/* ---------------code --------------- */
Assuming a wrapper such as:

#include <stdio.h>
int main (void)
{
....
return 0;
}
char dictfilename[256]="test.txt";
Why do you waste so many bytes for a simple string literal?

static char const dictfilename[] = "test.txt";
FILE *dictfile;
struct stat stats;
This is not standard C.
dictfile = fopen(dictfilename,"rb");
if (stat (dictfilename, &stats) == -1)
The standard basic way is:

if (dictfile == NULL)
{
printf("dict file not exist!\n");
return 0;
0 means 'OK'. Better to use EXIT_FAILURE...
}

int buffer[256]={1,2,3,4,5,6,7,8,9};
Why in the world do you need to initialize this array? Debug purpose?
fread (buffer, sizeof(int), 256, dictfile);
It's important to store and test the returned value. It gives indications
about the reading operation results. Open your C-book for details.
fclose (dictfile);
for(int i=0; i<16; ++i)
printf("0xd%",buffer[i]);
This is very bad. You need to read your C-book more carefully:

{
printf ("0x%X ", (unsigned) buffer[i]);
}
printf ("\n");

I see what you intend to do. Be careful that the binary representation of
objetcts bigger than a byte may change from an implementation to another. It
means that you file can have the following bytes :

0x12 0x34

but once read and converted 'rawly', you can obtain:

0x1234
0x0001234
0x3412
0x34120000
etc. which are all different. Details belongs to your platform (endianness,
data width etc.)

Nota that some implementations supply 'hton()' 'or 'ntoh()' family functions
to convert properly the data (assuming h = host and n = network, hence MSB
first)
/* ---------- end of the code ---------- */


Try this, but be careful, as explained above, the result is not portable.

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

int main (void)
{
int ret;
static char const dictfilename[] = "test.txt";
FILE *dictfile = fopen (dictfilename, "rb");

if (dictfile == NULL)
{
if (errno)
{
perror (dictfilename);
}
ret = EXIT_FAILURE;

#if 0
/* to make the binary file if not exists... */
{
char buffer[] =
{0xEF, 0xBB, 0xBF, 0x0D, 0x0A, 0x3C};

FILE *dictfile = fopen (dictfilename, "wb");
size_t i;

for (i = 0; i < sizeof buffer; i++)
{
fputc (buffer[i], dictfile);
}
fclose (dictfile);
}
#endif
}
else
{
int buffer[256] =
{1, 2, 3, 4, 5, 6, 7, 8, 9};

int n = fread (buffer
,sizeof *buffer
,sizeof buffer / sizeof *buffer
,dictfile);

if (feof (dictfile))
{
printf ("EOF\n");
}

if (ferror (dictfile))
{
if (errno)
{
perror (dictfilename);
}
ret = EXIT_FAILURE;
}
else
{
ret = EXIT_SUCCESS;
}

fclose (dictfile);

{
int i;
for (i = 0; i < n; ++i)
{
printf ("%04X ", (unsigned) buffer[i]);
}
printf ("\n");
}
}
return ret;
}

<Borland C 3.1 (16-bit)>

D:\CLC\Y\YANG>bc proj.prj
EOF
BBEF 0DBF 3C0A

</>

--
-ed- em**********@noos.fr [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
Nov 14 '05 #4
*** post for FREE via your newsreader at post.newsfeed.com ***

Thank you for your help.
I am a newbie in C.
as you said I should open my C-book and study carefully
"Emmanuel Delahaye" <em**********@noos.fr> дʼ
news:Xn***************************@213.228.0.75...
In 'comp.lang.c', "Lingyun Yang" <yz***@etang.com> wrote:
*** post for FREE via your newsreader at post.newsfeed.com ***

Dear all,

I have a file it's binary data viewed in UltraEdit is
EF BB BF 0D 0A 3C .......
I want to read them into a int or long int array byte[]
It makes a difference. Be more informative.

The id 'byte' is inappropriate here. A 'byte' is the smallest addressable
amount of memory for a given platform.
for example:
byte[0]=0xEFBB
byte[1]=0xBF0D

I write the following code, but the output isn't right:


Your code is very broken.
/* ---------------code --------------- */


Assuming a wrapper such as:

#include <stdio.h>
int main (void)
{
...
return 0;
}
char dictfilename[256]="test.txt";


Why do you waste so many bytes for a simple string literal?

static char const dictfilename[] = "test.txt";
FILE *dictfile;
struct stat stats;


This is not standard C.
dictfile = fopen(dictfilename,"rb");
if (stat (dictfilename, &stats) == -1)


The standard basic way is:

if (dictfile == NULL)
{
printf("dict file not exist!\n");
return 0;


0 means 'OK'. Better to use EXIT_FAILURE...
}

int buffer[256]={1,2,3,4,5,6,7,8,9};


Why in the world do you need to initialize this array? Debug purpose?
fread (buffer, sizeof(int), 256, dictfile);


It's important to store and test the returned value. It gives indications
about the reading operation results. Open your C-book for details.
fclose (dictfile);
for(int i=0; i<16; ++i)
printf("0xd%",buffer[i]);


This is very bad. You need to read your C-book more carefully:

{
printf ("0x%X ", (unsigned) buffer[i]);
}
printf ("\n");

I see what you intend to do. Be careful that the binary representation of
objetcts bigger than a byte may change from an implementation to another.

It means that you file can have the following bytes :

0x12 0x34

but once read and converted 'rawly', you can obtain:

0x1234
0x0001234
0x3412
0x34120000
etc. which are all different. Details belongs to your platform (endianness, data width etc.)

Nota that some implementations supply 'hton()' 'or 'ntoh()' family functions to convert properly the data (assuming h = host and n = network, hence MSB
first)
/* ---------- end of the code ---------- */


Try this, but be careful, as explained above, the result is not portable.

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

int main (void)
{
int ret;
static char const dictfilename[] = "test.txt";
FILE *dictfile = fopen (dictfilename, "rb");

if (dictfile == NULL)
{
if (errno)
{
perror (dictfilename);
}
ret = EXIT_FAILURE;

#if 0
/* to make the binary file if not exists... */
{
char buffer[] =
{0xEF, 0xBB, 0xBF, 0x0D, 0x0A, 0x3C};

FILE *dictfile = fopen (dictfilename, "wb");
size_t i;

for (i = 0; i < sizeof buffer; i++)
{
fputc (buffer[i], dictfile);
}
fclose (dictfile);
}
#endif
}
else
{
int buffer[256] =
{1, 2, 3, 4, 5, 6, 7, 8, 9};

int n = fread (buffer
,sizeof *buffer
,sizeof buffer / sizeof *buffer
,dictfile);

if (feof (dictfile))
{
printf ("EOF\n");
}

if (ferror (dictfile))
{
if (errno)
{
perror (dictfilename);
}
ret = EXIT_FAILURE;
}
else
{
ret = EXIT_SUCCESS;
}

fclose (dictfile);

{
int i;
for (i = 0; i < n; ++i)
{
printf ("%04X ", (unsigned) buffer[i]);
}
printf ("\n");
}
}
return ret;
}

<Borland C 3.1 (16-bit)>

D:\CLC\Y\YANG>bc proj.prj
EOF
BBEF 0DBF 3C0A

</>

--
-ed- em**********@noos.fr [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/



-----= Posted via Newsfeed.Com, Uncensored Usenet News =-----
http://www.newsfeed.com - The #1 Newsgroup Service in the World!
-----== 100,000 Groups! - 19 Servers! - Unlimited Download! =-----

Nov 14 '05 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

83
by: kartik | last post by:
there seems to be a serious problem with allowing numbers to grow in a nearly unbounded manner, as int/long unification does: it hides bugs. most of the time, i expect my numbers to be small. 2**31...
12
by: Woodster | last post by:
I currently have some code for an application that is running on Win32. I have tried to keep anything not directly gui related as separate as possible for portability reasons, including file...
4
by: domtam | last post by:
Suppose I have one of those USB storage devices (like a mp3 player, USB thumbdrive, or even digital camera) connected to my computer. I'd like to write a C# program that can - detect that the...
40
by: Abby | last post by:
My .dat file will contain information like below. /////////// First 0x04 0x05 0x06 Second 0x07
2
by: somequestion | last post by:
During copying file , wanna read file Size like this string CheckFileSize(string fileName) { if( fileName == null ) return; FileInfo fi = new FileInfo(fileName); return fi.Length.ToString();...
1
by: potluri040 | last post by:
hi, could any one let me know how to read file thru VB script. Scenerio is like this: i am keeping a personal details such as name, age, sex, company, location in a text file called user details...
3
by: =?Utf-8?B?Sm9obiBXYWxrZXI=?= | last post by:
Hi, Is there anything wrong with the code below in sending my browser page to Excel? Before my page opens in Excel there's a message "Problems came up in the following areas during load:" and it...
1
by: tkpmep | last post by:
To pretty up some numbers stored as strings, I used locale to format them with commas. I then found the following error: 'English_United States.1252' Traceback (most recent call last):...
2
by: danimian | last post by:
Hello, first i am creating xml file if file does not exist. String myFile = "C:\myxmlfile.xml"; if (!File.Exists(myFile)) { using (FileStream conStream = new FileStream(myFile,...
0
by: lllomh | last post by:
Define the method first this.state = { buttonBackgroundColor: 'green', isBlinking: false, // A new status is added to identify whether the button is blinking or not } autoStart=()=>{
2
by: DJRhino | last post by:
Was curious if anyone else was having this same issue or not.... I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 4 Oct 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
2
by: giovanniandrean | last post by:
The energy model is structured as follows and uses excel sheets to give input data: 1-Utility.py contains all the functions needed to calculate the variables and other minor things (mentions...
3
NeoPa
by: NeoPa | last post by:
Introduction For this article I'll be using a very simple database which has Form (clsForm) & Report (clsReport) classes that simply handle making the calling Form invisible until the Form, or all...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 1 Nov 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM) Please note that the UK and Europe revert to winter time on...
3
by: nia12 | last post by:
Hi there, I am very new to Access so apologies if any of this is obvious/not clear. I am creating a data collection tool for health care employees to complete. It consists of a number of...
0
NeoPa
by: NeoPa | last post by:
Introduction For this article I'll be focusing on the Report (clsReport) class. This simply handles making the calling Form invisible until all of the Reports opened by it have been closed, when it...
2
by: GKJR | last post by:
Does anyone have a recommendation to build a standalone application to replace an Access database? I have my bookkeeping software I developed in Access that I would like to make available to other...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.