Solved

File Manipulation - Cant Define 'FILE'

Posted on 2007-11-30
20
895 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
Active Directory Webinar

We all know we need to protect and secure our privileges, but where to start? Join Experts Exchange and ManageEngine on Tuesday, April 11, 2017 10:00 AM PDT to learn how to track and secure privileged users in Active Directory.

 
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
 
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

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
best sources to up-to-date in C++? 8 91
An API detour question 7 93
Copy output image from TWindowsMediaPlayer 6 48
Loading flat file data in tables 2 41
When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
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.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

829 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