Avatar billede julle.p Nybegynder
05. april 2008 - 20:48 Der er 9 kommentarer og
1 løsning

Sætning fra fil i C

Hej alle.

Jeg er ved at programmere et Hangman-spil i C. I det her tilfælde bliver det sætninger man skal gætte. Disse sætninger kommer fra en fil.

Jeg vil så lave et tilfældigt tal (interval: et tal for hver sætning) så jeg kan få en tilfældig sætning hver gang. For ikke at få samme talrække ved hver programstart benytter jeg "time":

srand(time(NULL));
randomTal = rand() % 6;

Nu skal jeg så indlæse den tilfældige sætning ud fra dette tal, og her opstår problemmet... :-S

Jeg har selv rodet med følgende:

do
{
  c = fgetc(RandomListe);
      if(c == '.')
      {   
        n++;
    while(n==randomTal)
    {
        seek=fseek(RandomListe,0L,SEEK_CUR);
        tell=ftell(RandomListe);
       
            for(count = 1L; count<=tell; count++)
        {
        fseek(RandomListe,-count,SEEK_CUR);               
        randomOrd[length]=getc(RandomListe);
        }
            break;
    }
    }
}

Lad os antage det tilfældige tal er 2.
Jeg bruger altså et punktum til at indikere hvor en sætning slutter, når jeg støder på nr 2 punktum gemmer jeg denne placering. Men hvordan får jeg nu indlæst den sætning....

Kan i se min tankegang eller er det noget rod?
Avatar billede julle.p Nybegynder
05. april 2008 - 20:49 #1
Slutningen på do-while sætninger kommer her:

while(c != EOF);
Avatar billede arne_v Ekspert
05. april 2008 - 20:55 #2
Den simple løsning vil være:

en sætning per linie i filen

når du trækker n (i interval 0..N-1) som tilfældigt tal så skipper du n linier
i filen og læser en linie
Avatar billede julle.p Nybegynder
06. april 2008 - 00:58 #3
Men det er det jeg ikke kan finde ud af. At læse fra et udvalgt sted.
Avatar billede arne_v Ekspert
06. april 2008 - 02:28 #4
Og der er det mit forslag er at skippe og læse linier fremfor at bruge fseek.
Avatar billede arne_v Ekspert
06. april 2008 - 02:41 #5
Eksempel:

r.txt
=====

Dette er linie 1
Dette er linie 2
Dette er linie 3
Dette er linie 4
Dette er linie 5

r.c
===

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void lineread(FILE *fp, char *buf, int bufsiz, int lineno)
{
    int i;
    fseek(fp, 0, SEEK_SET);
    for(i=0;i<=lineno;i++) fgets(buf, bufsiz, fp);
    buf[strlen(buf)-1] = '\0';
}

int main()
{
    FILE *fp;
    int i,lineno;
    char line[100];
    fp = fopen("r.txt", "r");
    srand(time(NULL));
    for(i=0;i<10;i++)
    {
        lineno = rand() % 5;
        lineread(fp, line, sizeof(line), lineno);
        printf("Read: %s\n", line);
    }
    return 0;
}
Avatar billede julle.p Nybegynder
06. april 2008 - 12:05 #6
Yes, det virker :-P Og er noget simplere end mit forslag. For at det skal gøre som jeg vil ha' ser det nu sådan ud:

Eksempel:

r.txt
=====

Dette er linie 1
Dette er linie 2
Dette er linie 3
Dette er linie 4
Dette er linie 5

r.c
===

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void lineread(FILE *fp, char *buf, int bufsiz, int lineno)
{
    int i;
    fseek(fp, 0, SEEK_SET);
    for(i=0;i<=lineno;i++) fgets(buf, bufsiz, fp);
    buf[strlen(buf)-1] = '\0';
}

int main()
{
    FILE *fp;
    int i,lineno;
    char line[100];
    fp = fopen("r.txt", "r");
    srand(time(NULL));
   
        lineno = rand() % 5;
        lineread(fp, line, sizeof(line), lineno);
        printf("Read: %s\n", line);
   
// Altså den læser kun én linje, og ikke alle.

    return 0;
}


Dog er jeg ikke helt med på hvad det egentlig er lineread() gør, samt hvordan den egentlig returnere det den læser...?
Avatar billede julle.p Nybegynder
06. april 2008 - 12:28 #7
Du returnere selvfølgelig vha at en pointer :-)

Men vil du forklare hvad der ellers sker?
Avatar billede arne_v Ekspert
06. april 2008 - 15:47 #8
lineread returnerer i buf

ideen er at:
  - hver sætning er en linie i filen
  - sætningerne/linierne nummererer 0..N-1

hvis vi kalder lineread med lineno=3 så kører for løkken fra 0 til og med 3

d.v.s. at vi læser:

sætning med index 0
sætning med index 1
sætning med index 2
sætning med index 3

vi læser altid ind i buf d.v.s. buf indeholder det sidst læste - i dette tilfælde
sætning med index 3, som er det vi skal bruge når vi vi kalder med lineno=3.

Det er ikke nødvendigvis den meste effektive måde at gøre det på, men logikken er
rimelig simpel at overskue.
Avatar billede arne_v Ekspert
06. april 2008 - 15:47 #9
og et svar
Avatar billede julle.p Nybegynder
06. april 2008 - 16:54 #10
det er simpelthen bare perfekt!!!

Mange gange tak.
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