Avatar billede lassel Nybegynder
10. maj 2004 - 15:25 Der er 5 kommentarer og
1 løsning

Fil print - bedst ;o)

Hejsa.
Jeg er lidt aktiv på exp for tiden som den amatør C-programmør jeg nu en gang er ;o)

Nå, men her kommer endnu et spørgsmål fra undertegnet.

Jeg har en fil der f.eks. ser således ud:
LLL:!SPACE!:6:!SPACE!:4:!SPACE!:12:!SPACE!:3061:!NEWLINE!:LLL:!SPACE!:6:!SPACE!:4:!SPACE!:12:!SPACE!:3061:!NEWLINE!:LLL:!SPACE!:6:!SPACE!:4:!SPACE!:12:!SPACE!:3061:!NEWLINE!:LLL:!SPACE!:6:!SPACE!:4:!SPACE!:12:!SPACE!:3061:!NEWLINE!:LLL:!SPACE!:6:!SPACE!:4:!SPACE!:12:!SPACE!:3061:!NEWLINE!:LLL:!SPACE!:6:!SPACE!:4:!SPACE!:12:!SPACE!:3061:!NEWLINE!:LLL:!SPACE!:6:!SPACE!:4:!SPACE!:12:!SPACE!:3061:!NEWLINE!:LLL:!SPACE!:6:!SPACE!:4:!SPACE!:12:!SPACE!:3061:!NEWLINE!:LLL:!SPACE!:6:!SPACE!:4:!SPACE!:12:!SPACE!:3061:!NEWLINE!:LLL:!SPACE!:6:!SPACE!:4:!SPACE!:12:!SPACE!:3061:!NEWLINE!:

Filen består af en linie, men 10 gange ens struktureret former med variabelt indhold.

Det jeg forsøger at lave er:
Et array med plads til 11. Alle pladser består af structs af samme form:

struct highscore {
  char name_str[4];
  int m;
  int n;
  int p;
  int points;
};
typedef struct highscore highscore;

10 første pladser i det gældende array[11] består af structs med indholdet fra ovennævnte fil.

Når filen er blevet hentet, parset således at alle :!SPACE!: sørger for at gemme i næste type i gældende struct og :!NEWLINE!: går til næste array[i] og fylder dette med et nyt struct til der ikke er mere i filen. Derefter printes den ud pænt i 10 linier. F.eks.
LLL 6 4 12 3061
LLL 6 4 12 3061
osv...

Jeg har leget lidt med det, men er absolut temmeli' ny i faget og har derfor fattet ingenting af hvad jeg roder mig ud i.

  highscore *data;
  int array[11];

  FILE *input_file;
  input_file = fopen("highscore", "r");

  /* et eller andet der parser osv osv osv */
  /* et eller andet der gemmer parset i array */
  /* et eller andet der udprinter array */

  fclose(input_file);


Sætter point lidt højt, men jeg har ingen idé om hvorledes abstraktionsniveauet er for denne opgave, og satser derfor lidt højt.
Avatar billede bertelbrander Novice
10. maj 2004 - 20:18 #1
Måske noget i stil med:

#include <cstdio>
#include <iostream>

using namespace std;

struct highscore
{
  char name_str[4];
  int m;
  int n;
  int p;
  int points;
};

int main(void)
{
  char line[1024];
  highscore hs;
  FILE *f = fopen("test.dat", "rt");
  if(!f)
    return EXIT_FAILURE;

  while(fgets(line, sizeof(line), f))
  {
    char *s = line;
    int Num;
    do
    {
      Num = sscanf(s, "%[^:]:!SPACE!:%d:!SPACE!:%d:!SPACE!:%d:!SPACE!:%d:!NEWLINE!:",
                    hs.name_str, &hs.m, &hs.n, &hs.p, &hs.points);
      if(Num == 5)
      {
        cout << hs.name_str << " " << hs.m << " " << hs. n << " " << hs.p << " " << hs.points << endl;
        s = strstr(s, "NEWLINE");
        if(s)
          s += strlen("NEWLINE!:");
      }
    }
    while(Num == 5 && s);
  }

  fclose(f);
}

Det læser alle bruger data ind i samme struct. Det kan læse mere en en linie, der er ingen begrænsninger på antallet af brugere pr linie.
Avatar billede lassel Nybegynder
10. maj 2004 - 21:47 #2
Først. Jeg glemte vist at sige at jeg laver det i rent C, undskyld.
Andet. Jeg tror stadig jeg får brug for at lave arrays, da jeg også skulle kunne sammenligne diverse linier/points uden alt for meget bøvl.
Tredje. Tror også det ville være nemmere at lave den omvendte funktion, altså læser 10 linier ind i filen igen :o)

Desuden ville jeg gerne kunne holde mig til 3 følgende hjælpe filer ;o)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

Nevertheless så er der dog en hel del muligheder i det du skriver der, og jeg er ret sikker på jeg kan lave mit eget script derudfra. Så jeg takker mange gange, og beder dig lægge et svar :o)
Avatar billede bertelbrander Novice
10. maj 2004 - 22:34 #3
Selve indlæsningen sker med sscanf() der er defineret i stdio.h, og er ren C.

Jeg forsøger at undgå point.
Avatar billede lassel Nybegynder
10. maj 2004 - 22:52 #4
Hehe, forsøger at undgå point ;o) Fair nok;

Netop det jeg mener med jeg egentlig er fint tilfreds med det du fremlægger. Den sscanf kan det jeg har brug for. Og når jeg har tænkt mig at reverse den og lægge linier tilbage til filen kan jeg vel nok bruge sprintf? :o)
Avatar billede bertelbrander Novice
10. maj 2004 - 23:10 #5
Man bruger fprintf() til at skrive til filer, sprintf() er til at skrive til en char *
Avatar billede lassel Nybegynder
24. juni 2005 - 23:12 #6
Tjek
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