Solved

File Manipulation - Cant Define 'FILE'

Posted on 2007-11-30
20
891 Views
Last Modified: 2008-02-01
I have a compiled DLL that I am trying to use.  Basically I pass it some values, and it passes some back.
That part is working one value at a time.

I need it to be able to run on a file full of values.  I have been out of the C/C++ world for a while so I'm a bit rusty.  My basic problem is I can't open a file.

I am using Visual Studio 2005.  
I have the following includes:
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

When I put the statement:     FILE *fname;
I get the error:   error C2275: 'FILE' : illegal use of this type as an expression

When I try to #include <iostream>  I get ~100 errors coming from the cstdio

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <windows.h>
 

struct testcase_list

       {

       char      TestNum[6];

       char      TrackStr[20];

       char      RouteStr[11];

       char      ExpectBar[65];

       int       ExpectRC;

       }

void GetTheBarValue( char*);

int main(int argc, char *argv[])

{

	char s[66];

	switch(argc)

	{

		case 3:

			// argv[0] = Program Name

			// argv[1] = All but postnet

			// argv[2] = Postnet

			for (j = 0;j < 20;j++)

			{

				testcase[0].TrackStr[j] = argv[1][j];

			};

			for (j = 0;j < 11;j++)

			{

				testcase[0].RouteStr[j] = argv[2][j];

			};

		case 4:

			argv[0] = argv[0];

			FILE *stream;

	};
 

	GetTheBarValue(s);

	s[65] = '\0';

	printf("Encoded Bar String is: %s\n",s);

}
 

void GetTheBarValue(char* s)

{

    HINSTANCE hinstLib; 

    MYPROC ProcAdd; 

    hinstLib = LoadLibrary(TEXT("usps4cb")); 

    ProcAdd = (MYPROC) GetProcAddress(hinstLib, "USPS4CB"); 
 

   memcpy(TrackString,testcase[0].TrackStr,20);

   TrackString[20] = '\0';
 

   memcpy(RouteString,testcase[0].RouteStr,11);

   RouteString[11] = '\0';
 

   memset(BarString, ' ', sizeof(BarString));   /* Prime blanks!  */

   BarString[65] = '\0';                        /* Set null       */
 

   RetCode = (ProcAdd)(TrackString,RouteString,BarString);

   memcpy(s,BarString,65);

   };

Open in new window

0
Comment
Question by:TeamSrv
  • 8
  • 6
  • 6
20 Comments
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 20382145
The include statement

#include <fstream>  
using namespace std;

is missing.

You also should change to

#include <string>  // not <string.h>

Regards, Alex
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 20382189
>>>>   case 4:
>>>>       argv[0] = argv[0];
>>>>      FILE *stream;

I assume it is a test only...

>>>>   argv[0] = argv[0];  
makes not much sense

>>>> FILE *stream
Beter use ifstream class and 'stream' is a bade name because of ambiguities.

     ifstream  file(argv[1]);
     if (!file)
     {
            cout << "error " << argv[1] << " cannot be opened for read << endl;
            return;
     }


If you define new variables in a case put all into curly brackets:

case 4:
    {
            ifstream  file(argv[1]);
            ...
           
    }

Regards, Alex
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20382217
>>You also should change to
>>#include <string>  // not <string.h>

why?
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 20382322
>>> >>#include <string>  // not <string.h>

>>>> why?

std::string is part of the C++ standard. The 'string.h' is old - deprecated - string header which shouldn't be used in newer C++ code.

(I am pretty sure, you know that, Jaime).
0
 
LVL 2

Author Comment

by:TeamSrv
ID: 20382344
Hi Alex.
When I put in:
#include <fstream>  
using namespace std;
I get 100 or so errors coming from cstdio
I have the same problem when I switch string.h to string


Itsmeandnobodyelse:
Yeah I just have the argv[0] = argv[0];   in there so when I comment out the FILE *stream it does not see an empty case statement
I tried adding the ifstream  file(argv[1]); statement, but got the error C2065: 'ifstream' : undeclared identifier
Is there an include that I am missing?
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20382383
@alex
string.h belong to the standard C library, like the required by strupr() function. The author is working with C library.
Indeed this is a C language question and your are messing it with your C++ answers.

0
 
LVL 2

Author Comment

by:TeamSrv
ID: 20382403
Yeah this is in both the C and C++ forums.
0
 
LVL 55

Assisted Solution

by:Jaime Olivares
Jaime Olivares earned 150 total points
ID: 20382406
@TeamSrv
I suggest you to take a decision:
- To continue working with pure C library functions, like FILE *  and strings with char *
- Switch all your code to C++'s STL library, like std::ifstream and std::string

It is not recommended to mix both, specially for a beginner/intermediate programmer
0
 
LVL 2

Author Comment

by:TeamSrv
ID: 20382432
I would love to do that Jamie.  The reason why it is all hacked up like this is I have to use a 3rd party DLL that isnt playing nice.
The only way I was able to get it to work is with:
    HINSTANCE hinstLib;
    MYPROC ProcAdd;
    hinstLib = LoadLibrary(TEXT("usps4cb"));
    ProcAdd = (MYPROC) GetProcAddress(hinstLib, "USPS4CB");
   RetCode = (ProcAdd)(TrackString,RouteString,BarString);

But when I do that in C++, it is not happy.  
Sorry to change questions, but is there a better way to access a function in a DLL using C++?
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20382488
in your original question I see:
      FILE *fname;
but in the original source coude I see just:
     FILE *stream;
near to case '4'
Appears to be you are not sending all the source code.

About your last comment, what do you mean when you say that C++ is not happy? which error message are you getting. The more specifc you can be, the faster you will get an accurate answer.

0
What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 20382510
>>>> Indeed this is a C language question and your are messing it with your C++
answers.

Don't think that I deserved it to get blamed like that as the author told from "C/C++" in the original question, and used Visual Studio 2005 which mainly is an IDE for C++. Moreover the problem arised when including <iostream> what obviously is a C++ header.

0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 20382540
>>>> But when I do that in C++, it is not happy.  
>>>> Sorry to change questions, but is there a better way to access a function in a DLL using C++?

You can do in either language.

If your source has .c extension it was compiled with ANSI C compiler. If it has .cpp the C++ compiler was used.

With C++ you have the better support in the Visual Studio.

0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20382577
>>Don't think that I deserved it to get blamed like that as the author told from "C/C++" in the original question,
Sorry for that, but not always the TA is a good reference IMHO, I think this new feature is confusing.
But I think the solution has to keep the simpler as possible
0
 
LVL 2

Author Comment

by:TeamSrv
ID: 20382604
@Itsmaeandnobodyelse
I think you are helping me narrow down the issue,  the source code does have the .c extention.  I am re-doing it with the cpp extention.  That has taken care of the file issues that I was having.  Unfortunately it have prevented me from using the dll in the same manor.

@jaime
Errors such as it seems like these are C's way of looking at a dll and arent valid in C++
Ex:  HINSTANCE is being viewed as an undeclared identfier
0
 
LVL 39

Accepted Solution

by:
itsmeandnobodyelse earned 350 total points
ID: 20382616
The following compiles as a .cpp file

#include <windows.h>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
 
struct testcase_list
       {
       char      TestNum[6];
       char      TrackStr[20];
       char      RouteStr[11];
       char      ExpectBar[65];
       int       ExpectRC;
       };

void GetTheBarValue( char*, testcase_list* );

int main(int argc, char *argv[])
{
      int j;
      testcase_list   testcase[10] = { 0 };
      char s[66];
      switch(argc)
      {
            case 3:
                  // argv[0] = Program Name
                  // argv[1] = All but postnet
                  // argv[2] = Postnet
                  for (j = 0;j < 20;j++)
                  {
                        testcase[0].TrackStr[j] = argv[1][j];
                  };
                  for (j = 0;j < 11;j++)
                  {
                        testcase[0].RouteStr[j] = argv[2][j];
                  };
            case 4:
                  argv[0] = argv[0];
                  FILE *stream;
      };
 
      GetTheBarValue(s, testcase);
      s[65] = '\0';
      printf("Encoded Bar String is: %s\n",s);
}

typedef int (*MYPROC)(char*, char*, char*);
 
void GetTheBarValue(char* s, testcase_list* testcase)
{
    HINSTANCE hinstLib;
    MYPROC ProcAdd;
      char TrackString[20];
      char RouteString[20];
      char BarString[20];
    hinstLib = LoadLibrary(TEXT("usps4cb"));
    ProcAdd = (MYPROC) GetProcAddress(hinstLib, "USPS4CB");
 
   memcpy(TrackString,testcase[0].TrackStr,20);
   TrackString[20] = '\0';
 
   memcpy(RouteString,testcase[0].RouteStr,11);
   RouteString[11] = '\0';
 
   memset(BarString, ' ', sizeof(BarString));   /* Prime blanks!  */
   BarString[65] = '\0';                        /* Set null       */
 
   int RetCode = (ProcAdd)(TrackString,RouteString,BarString);
   memcpy(s,BarString,65);
}
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20382639
>>HINSTANCE is being viewed as an undeclared identfier
this is not related to C or C++, HINSTANCE is defined at windows.h

You can rename your file to .cpp and should work, even using pure C library functions.
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 20382650
>>>> Sorry for that, ...
No problem.

>>>>But I think the solution has to keep the simpler as possible
I always wonder why C is regarded as simpler than C++. You have less choices in C but IMO it is not simpler.
0
 
LVL 2

Author Comment

by:TeamSrv
ID: 20382730
Thanks for all your help guys!
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 20382907
TeamSrv,

I made the prog compile but I didn't look for teh program but only for the syntax errors.

There are some (logical) flaws, which you need to check for, e. g. the final function defines a RetCode but it was not returned. And I fear I have not looked for the correct dimension of the local strings either. As it is C++ now you may consider using string class, e, g, instead

   memcpy(TrackString,testcase[0].TrackStr,20);

you simply can make

          TrackString = testcase[0].TrackStr;

if TrackString was defined as

          string TrackString;   // not  char TrackString[20];
0
 
LVL 2

Author Comment

by:TeamSrv
ID: 20382991
Itsmeandnobodyelse,
Yup I caught those.  The main difficulty was just getting it ported over to C++.
It is functional now, atleast to the point where I can work further with it.
Thanks again
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The goal of this video is to provide viewers with basic examples to understand recursion in the C programming language.
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now