Avatar billede ladyhawke Novice
18. juni 2002 - 10:17 Der er 6 kommentarer og
1 løsning

læs linie i tekstfil

Hvordan indlæser jeg en hel linie (uanset længde) fra en tekstfil åbnet med ifstream? Den skal gemmes i char[] eller string format, problemet er at jeg ikke kender længden af den enkelte linie og jeg vil gerne undgå overallokering...
Avatar billede soepro Nybegynder
18. juni 2002 - 13:10 #1
Hvis du ikke kender den maksimale længde af een linie i filen, bliver du nødt til at antage at den er = filens længde, eller sætte en forventet max. på f.eks. 2000 tegn pr. linie.
Avatar billede ladyhawke Novice
18. juni 2002 - 13:12 #2
Det er hvad jeg gør nu, men måske er der nogen der kender en anden måde...
Avatar billede soepro Nybegynder
18. juni 2002 - 13:38 #3
Jeg har i et tilsvarende program simpelthen gjort det, at jeg gennemlæser filens første 32 KB (via en midlertidig buffer) og så finder den maksimale record længde indenfor disse 32 KB. Dernæst allokerer jeg hvad der er nødvendigt for at behandle hele filen.

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

int main(void)
{
  FILE *inpFile;
  char *tmpBuffer;
  int  maxRcdLen, readLen;

  /* Find maksimale record længde < 32 KB. */
  tmpBuffer = new char[32000];
  if ((inpFile = fopen("test.fil", "rb"))              == NULL
  ||  (readLen = fread(tmpBuffer, 1, 32000KB, inpFile)) == 0)
    return -1;
  fclose(inpFile);

  maxRcdLen = 0;
  for (int idx = 0, tmpLen = 0; idx < readLen; idx++)
  { /* En linie afsluttes med CR+LF */
    if (*(tmpBuffer+idx) == '\r' && *(tmpBuffer+idx+1) == '\n')
    {
      if (tmpLen > maxRcdLen)
        maxRcdLen = tmpLen;
      tmpLen = 0;
      idx++;
    }
    else
      tmpLen++;
  };
  delete[] tmpBuffer;
  fclose(inpFile);

  /* Så indeholder maxRcdLen den længde du skal bruge til din buffer. */
  cprintf("Maksimal record-længde = %d.\r\n", maxRcdLen);
  return 0;
}
Avatar billede mbulow Nybegynder
18. juni 2002 - 13:43 #4
Du kan eventuelt prøve med getline-funktionen.
Den læser data fra en input-stream, og gemmer den i en string.
Som standard (Som i eksemplet) læser den indtil den finder en newline ('\n').
Men den KAN sættes til at bruge et andet tegn som 'delimiter' ved at skrive f.eks.: getline(ifs, s, ' '), så indlæser den indtil den finder et mellemrum.



Eksemplet indlæser en simpel tekstfil, linje efter linje, og udskriver dem til consolen:



#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[]){
    ifstream ifs("C:\\Temporary\\Eksperten225828.txt");
    string s;

    while(!ifs.eof()){
        getline(ifs, s);
        cout << s << endl;
    }

    return 0;
}
Avatar billede ladyhawke Novice
18. juni 2002 - 13:58 #5
jeg får en "getline undeclared identifier" fejl i min kode, hvorfor?

getline bliver kaldt som følger:

while(!fileStream.eof())
{       
    getline(fileStream, strLine);
    m_strStatus += strLine;
}
Avatar billede mbulow Nybegynder
18. juni 2002 - 14:42 #6
Ahh... Så har du sandsynligvis inkluderet string sådan her:
#include <string.h>

Men for at få fat i getline skal du også lige tilføje:
#include <string>    // Uden .h



Jeg troede i starten det var to måder at skrive det samme (Med og uden .h), men det er det absolut ikke, begge filerne eksisterer, og indholdet er vidt forskelligt :)
Avatar billede ladyhawke Novice
18. juni 2002 - 14:50 #7
Det er garanteret det! Jeg får kun et par andre småfejl nu, men det er ikke i forbindelse med dette...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester