Question

How to read a binary file into a string?

Asked by: Grendel666

Hi all,

I'm trying to write a small app that examines all files in a specified directory and gets a certain value from each file, then output the results somewhere (memo pad at the moment).

I have binary files (Oracle Forms compile .fmx files, in case you're interested) in which I want to search for the word 'Revision' and get the numbers just after the word.

I have tried ReadLn until EOF, but as it's a binary file, I suspect that there is an EOF marker somewhere in the file that stops before the code finds 'Revision'.  I used ReadLn to add each line to a string variable (have tried widestring as well) to store the whole file in memory.  But when the string is examined (using pos) for the word 'Revision', it does not exist, even though when I open the file in Wordpad (or Notepad) I can clearly see it.

Here's a snippet of code for the ReadLn :

var
    fFileIn : TextFile;
    sLine : widestring; (or string)
    nPos : integer;
    bFinished : boolean;
    sRevision : string;
begin
.....
        bFinished := False;
        Repeat
            ReadLn(fFileIn, sLine);
            sLine := Trim(sLine);

            nPos := pos('Revision', sLine);
            sRevision := 'Unknown'
            IF nPos <> 0 THEN
               (get the revision number by looking at the next few chars)
                ....
                bFinished := True;
            end; // IF
        Until EOF(fFileIn) OR bFinished;

When looking in WordPad, the word 'Revision' is completely on one line (i.e. not split over two lines).
sLine does never contain any part of 'Revision', even though it exists in the file.

I then tried using BlockRead, but that gives the same problem (as well as destroying my local loop variable and other localstring variables).

Here's the blockread snippet of code :

var
    fFileIn : File;
    sFile : string;
    sTemp : char;
begin
.....

        Repeat
                blockread(fFileIn, sTemp, 1);
                sFile := sFile + sTemp;
        Until EOF(fFileIn);

Some of the files I am searching through do return the word 'Revision', but some don't, for each version of the code.

I thought about seeing what the value of each character is and dispensing with any below an ASCII value of 65 ('A'), but then I'll be getting rid of the EOF marker, so the code will just loop forever, unless I put some kind of counter in.  I did try this with a counter of 5000 (the word appears about 4600), but even that didn't get me anywhere.

Any ideas would be gratefully recieved.  (Or the names of any Windows apps that would do this for me!)

I can increase the points depending on the answer.  ;)

Thanks,

Grendel.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2005-02-17 at 02:18:18ID21318238
Tags

binary

,

file

,

read

Topic

Delphi Programming

Participating Experts
6
Points
250
Comments
7

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Readln Problem
    When I use the Readln procedure to read a line from a text file, everything goes ok. But when I use it within a loop to read the body of the text it gives me everything but when there's a empty line (or simply a couple of carraige returns, whatever) it doesn't give back a re...
  2. binary
    What is the fastest way to insert a record with binary data in TQuery ? Andrew
  3. Memo Field
    If I have a function that delivers a memo field, Is there a way to convert it to a string?
  4. hex string to binary string
    I have a string that contains a hex number, say String s_hex = "1A2B"; and I want a string that contains that number in binary, but the binary string *must* be exactly 16 characters long; i.e. the string must be padded with zeros. So far, I've tried: s_bin = In...
  5. Memo equivalent?
    Hi, What is the equivalent data type of Memo (M$ Access) in Oracle? Is Oracle didnt have "Autonumber" data type? thanks.
  6. While not EOF... ReadLn... exhausts system memory
    I have exhausted my ability to debug this problem. Perhaps an 'expert' can pinpoint the programming flaw? All I am doing is reading a 380 megabyte text file, line by line. Somewhere around the 21 megabyte point, the Delphi 3 application starts exhausting all Windows physic...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: heretoreadPosted on 2005-02-17 at 02:47:54ID: 13333275

i thinks it's the way Pos works, it will scan until it finds the string end, which could be before you expect depending on the data.

eg STRING,0
    STRING,0,13,REVISION

so you will have to make your own string function, just use a for loop and check each character.

 

by: Imthiyaz_phPosted on 2005-02-17 at 02:50:00ID: 13333284

you could read a binary file to a string like this:

procedure TForm1.Button1Click(Sender: TObject);
var
  StStream: TStringStream;
  FStream: TFileStream;
  s: string;
begin
  FStream := TFileStream.Create('d:\test.exe', fmOpenRead);
  StStream := TStringStream.Create('');
  try
    StStream.CopyFrom(FStream, FStream.Size);
    s := StStream.DataString;

    if Pos('this', s) > 0 then
      ShowMessage('Found');
  finally
    StStream.Free;
    FStream.Free;
  end;
end;

 

by: ZhaawZPosted on 2005-02-17 at 03:06:29ID: 13333392

var
  f : file;   // untyped file
  s : string; // string for reading a file
begin
// assign a file to variable
AssignFile(f, 'D:\cpuspeed.txt');
// set access mode to read-only
FileMode := fmOpenRead;
// second parameter is needed only for untyped files. it's size of block.
reset(f, 1);
// make a string long enough to read all data from file
SetLength(s, FileSize(f));
// read all the data into a string
BlockRead(f, s[1], length(s));
// close file
CloseFile(f);
// check results
ShowMessage(s);
end;

 

by: kretzschmarPosted on 2005-02-17 at 03:13:30ID: 13333419

 

by: emirhPosted on 2005-02-17 at 06:28:12ID: 13334819

You should use
BlockRead(fileVar,value,1,numberRead)
to read bytes from binary file.
Declare value like Byte (var value : Byte) and after reading with BlockRead value will be
decimal number and you can find "Revision" comparing this decimal values with
coresponding ASCII codes .
Every time after reading one byte from binary file
compare value with ASCII value of letters you are looking for (for example
R=82, r=114, E=69 ...). When you find word "revision" then on the same way
read value you are looking for.

You can use this loop for searching through entire file:
repeat
  BlockRead(...,numRead);
until (numRead=0);

 

by: GwenaPosted on 2005-02-17 at 15:19:39ID: 13340523

From my ExeMod.pas unit
(you can find it here http://www.geocities.com/gacarpenter386/)

You may find other code snippets inside exemod that you can use in your program. :-)

//===================================================
//This code can read any file from disk and into a string

function File2String(FileName: string): string;
var
 MyStream: TFileStream;
 MyString: string;
begin
 MyStream := TFileStream.Create(FileName, fmOpenRead
   or fmShareDenyNone);
 try
   MyStream.Position := 0;
   SetLength(MyString, MyStream.Size);
   MyStream.ReadBuffer(Pointer(MyString)^, MyStream.Size);
 finally
   MyStream.Free;
 end;
 Result := MyString;
end;
//===================================================
 

 

by: Grendel666Posted on 2005-02-18 at 00:59:52ID: 13343555

Thanks everyone.

I mainly used the solution from Imthiyaz_ph.  The problem with my code came down to a line that I didn't show you :

sLine := copy(sLine, nPos, length(sLine) - nPos);

This was giving me a blank sLine string, even though the word was at nPos.  I sorted this by putting a loop around reading sLine[nLoop] and that worked.  But using filestream was much better than using ReadLn as well.

I have split the points to a few of you, thanks for all your help.

Grendel.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...