Avatar billede jixe Nybegynder
14. januar 2009 - 13:53 Der er 6 kommentarer

Læs linje i text-fil

Jeg vil meget gerne, at mit program kan læse fra bestemte steder i en text-fil - kan det lade sig gøre?

Jeg har forsøgt med:

std::string line;
std::fstream database ("db.txt");
while (!database.eof())
{
getline (database, line);
std::cout << line;
}
database.close();

men da læser programmet jo bare filen til ende. Som en start, vil jeg gerne kunne nøjes med at læse f.eks. linje 3, men hvis det er muligt, vil jeg også meget gerne kunne læse værdier ind i variabler fra text-filen, hvor værdierne i text-filen f.eks. er adskildt af mellemrum.

Er der nogle kloge mennesker, som kan hjælpe mig? :-)
Avatar billede segmose Nybegynder
14. januar 2009 - 14:02 #1
Kort svar det kan du ikke, medmindre linierne alle har den samme længde. Da programmet jo ellers ikke kunne vide hvor den enkelte linie startede.

hvis de har samme længde ALLE sammen, så kan du bruge funktioner som fseek/lseek til at finde starten på linien.

Til at indlæse værdier kan du enten bruge << eller fscanf hvis den ikke opføre sig som du gerne vil.
Avatar billede jixe Nybegynder
14. januar 2009 - 14:20 #2
Faktisk er alle linjerne lige lange (hvis mellemrum må tælle med), så det er jo meget heldigt. Men det jeg tækner er, at når jeg undlader while(!database.eof()), så læser getline kun første linje i tekst-filen. Altså den ved hvor en linje starter og slutter. Så må det vel også kunne lade sig gøre, at få læst linje 2 ud til skærmen..? Eller er jeg helt galt på den?

Min tekst-fil ser således ud:

Varenummer    Produktbeskrivelse    á Pris    Lagerplads
==========================================================
      1001                noget      123            32
      1002                andet        32            12

Første og anden linje vil jeg ikke have kopieret ind i programmet igen, mens 3. og 4. linje gerne skulle komme ind (individuelt).
Avatar billede jixe Nybegynder
14. januar 2009 - 14:21 #3
I notesblok står tingene i tekst-filen pænt under hinanden...
Avatar billede segmose Nybegynder
14. januar 2009 - 15:53 #4
Prøv at kør det her: (og håb mellemrummene ikke nogen gange er tabs)

std::string line;
std::fstream database ("db.txt");
while (!database.eof())
{
getline (database, line);
std::cout << line << " next line start at " << database.tellg() << endl;
;
}
database.close();

Så kan du se hvor dine linier starter, efter at have læst de 2 første kan du se hvor selve data starter og når du har læst den næste (din 1001) er forkellen fra før længden af en linie.
lad os sige at værdien efter 2 linier er 80 og efter den 3. er 110
så er hver data linie 110-80 lang.
for at finde linie X i din tekst fil skal du så lave en

database.seekg(startoflines+X*lengthofdatalines);

hvor startoflines var 80 i det her eksempel og lengthofdatalines var 30.
Avatar billede jixe Nybegynder
15. januar 2009 - 14:36 #5
Nu virker det sørme! Mange tak :-)

Men det med at få nogle af værdierne ind i variabler igen, det forstår jeg ikke helt. Du siger at jeg skal bruge fscanf..? Det er især varenummeret jeg gerne vil have ind i variabler igen, men også meget gerne prisen, hvis det er muligt...
Avatar billede segmose Nybegynder
18. januar 2009 - 23:55 #6
Når du har en linie skal du bruge noget som:

if (4 != sscanf(buffer, "%d %s %d %d", &vnum, prodBesk, &pris, &plads))
  cout << "error";

de korrekte typer og fejl behandling vil jeg overlade til dig.
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