Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C++ (http://www.go4expert.com/forums/cpp/)
-   -   fscanf (http://www.go4expert.com/forums/fscanf-t13648/)

Andres 9Sep2008 02:29

fscanf
 
Ok, I have this code using fscanf, basically what I want to do is to send lets say a string "y = " followed by a number. Then I close the file and then reopen it and scan it to take out the string and the number. The problem is that when I scan it, it doesnt give me the input data that I sent. Then what I want to do is to only send my desired data to another file. Can someone help me please?
Code:

#include <stdio.h>
#include <iostream>


using namespace std;

int main ()
{
  int i;
  int x;
 
  char str [80];
 
  FILE * pFile;
  FILE * pFile2;
  FILE * pFile3;
//Writing to file
  pFile = fopen ("aplus.txt","w+");
  fprintf (pFile, "%s %d", "Y =",30);
  printf ("%s %d\n",str,&i);
  fclose (pFile);
 
  system ("pause");
  //Getting from file
  pFile2 = fopen ("aplus.txt","r");
  rewind (pFile2);
  fscanf (pFile2, "%s", str);
  fscanf (pFile2, "%d", i);
 
 //Writing needed information to file
  pFile3 = fopen ("aplus2.txt","w+");
  fprintf (pFile3, "%d");
 
  fclose (pFile2);
  fclose (pFile3);
 
  printf ("%d and %s \n",&i, str);
 
  system("aplus.txt");
  system("aplus2.txt");
 
  return 0;
 
}


oogabooga 9Sep2008 03:17

Re: fscanf
 
Remember that fscanf needs an address, so if the variable is not already a pointer (like str)
then you need to put an ampersand in front of it (like &i).
Also remember that printf does NOT need the ampersand.
Code:

#include <stdio.h>

int main () {
  int i;
  char str [80];
  FILE * pFile;

  // Writing to file
  pFile = fopen ("aplus.txt", "w+");
  fprintf (pFile, "%s %d", "Y =", 30);
  fclose (pFile);

  // Getting from file
  pFile = fopen ("aplus.txt", "r");
  fscanf (pFile, "%s = %d", str, &i);
  fclose (pFile);

  printf ("Str: %s  Number: %d\n", str, i);

  system("pause");
  return 0;
}


Andres 9Sep2008 23:50

Re: fscanf
 
Thanks oogabooga,
hey now lets say that I dont create the file "aplus.txt".
Is it the same procedure if I want to scan another file that already exists.

For example.
Lets say theres is a file "whatever.txt" and it has three lines


Line1 "X = 23"
Line2 "Y = 34"
Line3 "Z = 12"

How would I extract the numbers only to my program?Help please.

oogabooga 10Sep2008 04:34

Re: fscanf
 
Absolutely, it should be the same procedure. Give it a try.
Post again if you have any trouble.

Andres 11Sep2008 23:48

Re: fscanf
 
Thanks it works, is this the right code to use?

Code:

#include <stdio.h>
#include <iostream>
#include <fstream>

using namespace std;


int main ()
{
  int i;
  int x;
  int y;
  int z;
 
  char str [80];
  FILE * pFile;
  FILE * pFile2;
 
 
  // Creating and Writing to file
  pFile = fopen ("aplus.txt", "w+");
  fprintf (pFile, "%s %d", "X =", 001);
  fprintf (pFile, "\n");
  fprintf (pFile, "%s %d", "Y =", 10000);
  fprintf (pFile, "\n");
  fprintf (pFile, "%s %d", "Z =", 21);
  fclose (pFile);

  // Getting from file
  pFile = fopen ("aplus.txt", "r");
  fscanf (pFile, "%s = %d", str, &i);
  x=i;
  fscanf (pFile, "%s = %d", str, &i);
  y=i;
  fscanf (pFile, "%s = %d", str, &i);
  z=i;
  fclose (pFile);

  cout<<x<<endl;
  cout<<y<<endl;
  cout<<z<<endl;
 
  //Sending wanted information to another created file
  pFile2= fopen ("aplus2.txt", "w+");
 ofstream file;
 file.open("aplus2.txt");
 file<<x<<endl<<y<<endl<<z<<endl;
 file.close();
 fclose (pFile);
  system("aplus.txt");
  system("aplus2.txt");
  return 0;
}


oogabooga 13Sep2008 00:22

Re: fscanf
 
It looks pretty good. A couple of points:
1. You don't need to print the newline separately.
Code:

So this:
  fprintf (pFile, "%s %d", "X =", 001);
  fprintf (pFile, "\n");
Can be this:
  fprintf (pFile, "%s %d\n", "X =", 001);

2. You don't need to read the numbers into the variable i and then transfer them to x, y, and z.
You can read them directly into x, y, and z like this:
Code:

fscanf (pFile, "%s = %d", str, &x);
fscanf (pFile, "%s = %d", str, &y);
fscanf (pFile, "%s = %d", str, &z);

3. You're mixing C and C++ file access techniques. You should probably stick with one
or the other in the same program. In particular, this code:
Code:

pFile2= fopen ("aplus2.txt", "w+");
ofstream file;
file.open("aplus2.txt");
file<<x<<endl<<y<<endl<<z<<endl;
file.close();
fclose (pFile); // note that you meant pFile2 here!

Should be like this:
Code:

ofstream file;
file.open("aplus2.txt");
file<<x<<endl<<y<<endl<<z<<endl;
file.close();

That is, you either use a FILE* pointer and fopen/fclose,
or you use an ofstream object and obj.open/obj.close.
There's no point in using both.


All times are GMT +5.5. The time now is 03:36.