Krijg na 1 functie geen waardes meer

Status
Niet open voor verdere reacties.

Wafelijzer

Gebruiker
Lid geworden
11 aug 2008
Berichten
7
Ik ben nog niet lang bezig met het programmeren en ben begonnen aan classes, nu heb ik een functie gemaakt die eenmalig goed werkt, maar als ik dezelfde functie achter elkaar gebruik icm cout dan krijg ik alleen bij de eerste opgeroepen functie de juiste waarde en bij de 2e cout krijg ik 0 ( dit is waarmee ik de variable initaliseer ). Het lijkt alsof de functie na 1 keer oproepen de while loop niet meer uitvoert

Groeten,
Jerry



jerry@jerry-desktop:~/.svn-repos/kicad_library_manager/src$ ./kicad-manager
File to open: modules.mod
File: modules.mod
Number of lines: 88
Number of lines: 0 <====



Mijn main:
PHP:
/*! Standard libraries */
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iomanip>

/*! Use standard namespace */
using namespace std;

/* Include classes */
#include "classes/module_library.h"

/*! Main function */
int main(int argc, 
         char *argv[])
{
  module_library module_library;

  string filename;
  cout << "File to open: ";
  getline(cin, filename);

  module_library.open_file(filename);
  module_library.print_file();

  cout << "Number of lines: " << module_library.number_of_lines() << endl << flush;
  cout << "Number of lines: " << module_library.number_of_lines() << endl << flush;

  return 0;
}


Functie regel teller
PHP:
/**************************************************************!
    Count number of lines
    @param ifstream_module_library
           Needs to be set with open_file() or set_input_file()
    @return line_counter Number of lines counted
***************************************************************/
unsigned int module_library::number_of_lines()
{
  /* Line counter */
  unsigned int line_counter = 0;

  /* Increment line_counter if file is open */
  if ( ifstream_module_library.is_open() )
  {
    /* Linebuffer */
    string linebuffer = "";

    /* Loop until end of input */
    while ( getline(ifstream_module_library, linebuffer) )
      line_counter++;

    /* Return number of lines */
    return line_counter;
  }

  /* Print error if ifstream_module_library is not open */
  else
   module_library::error( "input file is not open" );
}
 
Laatst bewerkt:
Oplossing

Ik heb een oplossing gevonden ( weet niet of het correct is ),

bij elke operatie ( functie oproep ) moet ik mijn ifstream openen en als ik klaar ben sluiten.

Nu krijg ik als ik de functie heroproep gewoon dezelfde waardes.
 
Als je met getline (of get) aan het einde van het bestand komt zal de volgende oproep van getline (of get) proberen om het einde van het bestand te lezen (er wordt bijgehouden waar in het bestand je voor het laatst gelezen hebt). Dit kan je oplossen door het bestand te sluiten en weer te openen of door met seekg de pointer weer aan het begin van het bestand te zetten.
 
Laatst bewerkt:
Sluiten en heropenen is inderdaad een oplossing.

Wat er eigenlijk gebeurt is dat bij het lezen van een file er wordt onthouden op welke positie je staat.
De eerste maal dat je functie wordt uitgevoerd staat de filepointer (<- zo noemt hetgene dat die positie bijhoudt) in het begin van je bestand.
Je loopt er lijn per lijn door, waardoor de filepointer uiteindelijk op het einde van de file staat.
Wanneer je de functie voor de 2de maal aanroept staat die filepointer nog steeds achteraan je bestand. En vanaf daar gezien volgen er inderdaad maar 0 regels meer ;)

Er bestaat wel een commando om de filepointer naar een bepaalde positie te verplaatsen, waardoor je de file niet altijd hoeft te heropenen, maar de signature ervan ontsnapt me even..
 
Ik snap de seekg functie, als ik die boven aan de functie zet heb ik nog altijd hetzelfde 88 regels en 0, maar als ik nu de seekg op end zet krijg ik bij ze allebei 0 regels uit


ifstream_module_library.seekg(0, ios::beg);

jerry@jerry-desktop:~/.svn-repos/kicad_library_manager/src$ ./kicad-manager
File to open: modules.mod
File: modules.mod
Number of lines: 88
Number of lines: 0


ifstream_module_library.seekg(0, ios::end);

jerry@jerry-desktop:~/.svn-repos/kicad_library_manager/src$ ./kicad-manager
File to open: modules.mod
File: modules.mod
Number of lines: 0
Number of lines: 0

Ik vindt het vrij logisch dat als ik de seek pointer naar het einde van de file zet dat getline niks meer kan vinden ....

Maar dat hij hem niet naar het begin zet ......
 
Verkort

FIXED



Todd A. Gibson aan Jerry
(http://www.augustcouncil.com/~tgibson/tutorial/)

On Wed, Aug 13, 2008 at 09:22:11PM +0200, Jerry Jacobs wrote:
> Hello Tod,
> I'm writing C++ since a short time and have a little bug in my program
> and do not know how to fix it.

module_library.seekg(0, ios::beg);
listing(module_library);
module_library.clear(); //ADD THIS LINE
module_library.seekg(0, ios::beg);
listing(module_library);



I assume what is happening is that you are hitting the end-of-file
which is triggering the EOF flag on the stream. Before you can
use the stream again you need to clear that flag. You can put
in:

if(module_library.eof())
std::cout <<"EOF flag is set!" << std::endl;

to confirm whether what I am saying is true.


/FIXED




Ik heb even een nieuwe verkorte versie geschreven zonder class en heb hetzelfde probleem:

Output:
jerry@jerry-desktop:~/Bureaublad$ ./ofstream_test
-----------------Unsorted--------------------------
[n=0]2PIN_6mm
[n=1]1PIN_6mm
[n=2]3PIN_6mm
-----------------Sorted--------------------------
[n=0]1PIN_6mm
[n=1]2PIN_6mm
[n=2]3PIN_6mm
Size of vector: 3
Number of lines in file: 88
Number of modules in file: 3
-----------------Unsorted--------------------------
-----------------Sorted--------------------------
Size of vector: 0
Number of lines in file: 0
Number of modules in file: 0


PHP:
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

void listing(ifstream &module_library)
{
  if( module_library.is_open() )
  {

  unsigned int number_of_lines=0;
  unsigned int module_counter=0;
  vector <string> vecNamen;
  string linebuffer;

    while ( getline(module_library, linebuffer) )
    {
      
      size_t pos;
       
      string module_name;

      number_of_lines++;
      pos = linebuffer.find("$MODULE");
      if (pos != string::npos)
        {
          string linebuffer_new;
          size_t module_position;
          module_position = linebuffer.find("$MODULE");
          linebuffer_new = linebuffer.substr(module_position+8);
          vecNamen.push_back(linebuffer_new);

          module_counter++;
        }

    }


    cout << "-----------------Unsorted--------------------------" << endl;
    for(int n = 0 ; n < vecNamen.size() ; n++){
                cout << "[n=" << n << "]" << vecNamen.at(n) << endl;
    }
    
    cout << "-----------------Sorted--------------------------" << endl;
    sort ( vecNamen.begin(), vecNamen.end() );
    for(int n = 0 ; n < vecNamen.size() ; n++){
                cout << "[n=" << n << "]" << vecNamen.at(n) << endl;
    }

    cout << "Size of vector: " << vecNamen.size() << endl;
    cout << "Number of lines in file: " << number_of_lines << endl;
    cout << "Number of modules in file: " << module_counter << endl;
 }
  
}


int main()
{
  ifstream module_library;
  module_library.open("modules.mod");

  module_library.seekg(0, ios::beg);
  listing(module_library);
  module_library.seekg(0, ios::beg);
  listing(module_library);


  module_library.close();
  return 0;
}
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan