C++ ifstream

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • prometheus345479
  • Registratie: Mei 2005
  • Laatst online: 12-10-2022
Hoi,

ik wil slechts bepaalde regels van een file inlezen, en wil dit zo efficient mogelijk doen. Ook wil ik in de file op en neer kunnen springen. ifstream leek me handig hiervoor. Nu ben ik er een beetje me aan het spelen geweest, en dat heeft de volgende code opgeleverd. Maar kan dit niet sneller/makkelijker?

Het probleem zit bij regels 59 t/m 63, waarbij ik de file close, clear, en dan weer opnieuw open. Kan ik de file niet gewoon open laten? (alleen met seekg() terug in de file gaan werkt niet, dit geeft een "debug assertion failed" melding in MS Visual C++)

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>               //read/write files (C style)
#include <vector>
#include <fstream>                //input (C++ style)
#include <string>                 //strings

using namespace std;


//Create vector with indices of all startingpoints of each line
void LoadFile(ifstream& File, vector<int> &FileIndex)
{
   //---------------Initialize variables------------------------
   const int length = 300;
   char dummy[length];

   cout << "Loop through file...\n";

   //-----------Loop over lines in SensorConfigFile-------------
   while(!File.eof())
   {
      //---------------store index of line----------------------
      FileIndex.push_back(File.tellg());
      
      //------------set pointer to next line--------------------
      File.getline(dummy,length);

      cout << dummy << " Pointer: " << FileIndex.back() << "\n";
   }

};


int main()
{
   //start and end lines
   int start = 5;
   int end   = 10;
    
   const int Length = 300;

   char FileName[] = "Testfile.txt";
   char chLine[Length];

   string Line;

   vector<int> FileIndex;

   //open file
   ifstream File(FileName);

   //load indices of file
   LoadFile(File, FileIndex);

   //set pointers
   int startindex = FileIndex[start-1];
   int endindex   = FileIndex[end-1];

   //close and reset file
   File.close();
   File.clear();

   //re-open file
   File.open(FileName);

   //set index to startindex
   File.seekg(startindex);

   //loop over lines
   while(File.tellg() <= endindex )
   {
       cout << "Pointer: " << File.tellg() << "\n";
       
       //-------------get line from config file------------------
       File.getline(chLine,Length);

       //convert char to string
       Line.clear();
       Line.assign(chLine);

       cout << Line << "\n";
   }

   return 0;
};

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

ik zal persoonlijk fscanf gebruiken.

Je kan de returnwaarde van fscanf ook checken. Is die kleiner dan of gelijk aan 0, dan is er geen match gevonden.

[ Voor 35% gewijzigd door Matis op 20-07-2009 13:55 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:02
prometheus345479 schreef op maandag 20 juli 2009 @ 13:53:
Hoi,

ik wil slechts bepaalde regels van een file inlezen, en wil dit zo efficient mogelijk doen. Ook wil ik in de file op en neer kunnen springen. ifstream leek me handig hiervoor. Nu ben ik er een beetje me aan het spelen geweest, en dat heeft de volgende code opgeleverd. Maar kan dit niet sneller/makkelijker?

Het probleem zit bij regels 59 t/m 63, waarbij ik de file close, clear, en dan weer opnieuw open. Kan ik de file niet gewoon open laten? (alleen met seekg() terug in de file gaan werkt niet, dit geeft een "debug assertion failed" melding in MS Visual C++)
ifstream.seekg zou moeten werken, klopt je argument niet?
C++ heeft daar alternatieven voor die je niet opzadelen met al die bufferbeheer problemen. Overigens zie ik niet waar je het hier zou willen gebruiken, er wordt per regel ingelezen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • prometheus345479
  • Registratie: Mei 2005
  • Laatst online: 12-10-2022
Ik ben inmiddels al iets verder met mijn zoektocht.

In mijn eerder geposte script wordt in LoadFile het einde bereikt van de file, waardoor onder andere de eof bit aangezet wordt. Als daarna met clear() de ifstream gecleared wordt, dan blijft die bit gewoon staan. En als je dan dingen uit gaat lezen, dan gaat het mis.

(dit heb ik gelezen, niet zelf grondig gecheckt)

Er is kennelijk geen reset functie voor...? :|

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 00:02
Met clear() wordt ook wel degelijk de eof-bit gecleart. Daar heb je alleen wat aan als je daarna niet alsnog door gaat met lezen aan het einde van een bestand, natuurlijk, dus moet je daarna nog wel terugseeken naar eerder in het bestand.

Acties:
  • 0 Henk 'm!

  • prometheus345479
  • Registratie: Mei 2005
  • Laatst online: 12-10-2022
Je hebt gelijk. Het werkt nu ook met alleen clear, en zonder het sluiten en opnieuw openen...

kennlijk is niet alles wat op internet staat waar 8)7

belachelijk. Bedankt voor de hulp iig.
Pagina: 1