Avatar billede djmaster Nybegynder
28. februar 2007 - 15:52 Der er 19 kommentarer og
1 løsning

Læse sidste 20 værdier fra fil ind i et int array

Jeg har et *.txt fil som er indeholder en hel masse værdier. Alle liggende mellem 0 og 255 (en byte)
txt filen kunne se sådan ud:
...
12
16
47
231
...

Hvordan får jeg læst de sidste 20 værdier af denne fil ind i et integer array?
Avatar billede yates Nybegynder
01. marts 2007 - 08:47 #1
int main(int argc, char *argv[])
{
  FILE* f;
  char* Buff=malloc(15); //evt mindre; du burger vel max 3 chars
  int arrVals[19];
 
  int N, X,i;
 
 
  f=fopen("Bok1.txt", "rb");
  N=0;
 
  while (!feof(f))
  {
        memset(Buff, 0,15);
        if (fgets(Buff, 15, f)!=NULL)
        {
          //printf(Buff);
          X=atoi(Buff);
          N++;
          for (i=1; i<=19;i++) arrVals[i-1]=arrVals[i];
          arrVals[19]=X;     
        }
       
           
  }
 
 
  fclose(f);
  for (i=0; i<=19;i++) printf("%i\n", arrVals[i]);
 
 
 
  system("PAUSE");   
  return 0;
}
Avatar billede yates Nybegynder
01. marts 2007 - 08:48 #2
Øj, glemte lige at memset vistnok ikke er nødvendig når man læser linjer med fgets. En /0 sættes automatisk på. Så du kan sløjfe den linje.

Y.
Avatar billede djmaster Nybegynder
01. marts 2007 - 09:38 #3
char* Buff=malloc(15);  // cannot convert from 'void*' to 'char*'
Det er den eneste fejl jeg får. (Jeg bruge MS visual C++)

Kunne det evt. laves med ifstream's
Avatar billede yates Nybegynder
01. marts 2007 - 10:42 #4
Hej,

dette løses med:

char* Buff= (char*) malloc(15);


Y.
Avatar billede djmaster Nybegynder
01. marts 2007 - 10:45 #5
Ok, så virker det.

f=fopen("Bok1.txt", "rb"); // hvad betyder "rb", jeg forstår ikke lige meningen

Jeg får en fejlmeddelelse fra windows når jeg kører programmet.
Avatar billede yates Nybegynder
01. marts 2007 - 10:46 #6
I øvrigt en temmelig tåbelig fejlmelding der.

Meldingen "cannot convert from 'void*' to 'char*'" er absurd i mine øjne; der er ikke meget at være i tvivl om overhovedet. MinGW har opdaget dette og det er ikke nødvendigt med et cast. Jeg kunne evt. gå med til en warning, men at den melder fejl, ja det fatter jeg simpelthen ikke. Hvis nogen kan belære mig, da vil jeg gerne høre. Gad vide hvad MS-programmørerne har tænkt?!
Avatar billede yates Nybegynder
01. marts 2007 - 10:47 #7
rb=read as binary,

men "r" er godt nok i stedet. Ikke grund til binary reads der.
Avatar billede djmaster Nybegynder
01. marts 2007 - 10:49 #8
skal det stå i ""?
Avatar billede yates Nybegynder
01. marts 2007 - 10:52 #9
f=fopen("Bok1.txt", "r");
Avatar billede djmaster Nybegynder
01. marts 2007 - 10:57 #10
Jeg får stadig en fejlmeddelse når jeg kører programmet.

Har prøvet at debugge, og jeg får en fejl, 2. gang løkken kører, ved linjen:  if (fgets(Buff, 15, f)!=NULL)
Avatar billede yates Nybegynder
01. marts 2007 - 10:59 #11
En lidt mere strømlinet version:

int main(int argc, char *argv[])
{
  FILE* f;
  char* Buff=malloc(15);
  int arrVals[19];
  int N, X,i;
  f=fopen("Bok1.txt", "r");
  N=0;
  while (fgets(Buff, 15, f)!=NULL)
        {
          X=atoi(Buff);
          N++;
          for (i=1; i<=19;i++) arrVals[i-1]=arrVals[i];
          arrVals[19]=X;     
        }
  fclose(f);
  printf("I alt %i tal findes i filen.\n", N);
  for (i=0; i<=19;i++) printf("%i\n", arrVals[i]);
  system("PAUSE");   
  return 0;
}
Avatar billede yates Nybegynder
01. marts 2007 - 11:00 #12
Hvilken fejl får du??
Avatar billede djmaster Nybegynder
01. marts 2007 - 11:04 #13
Unhandled exception in *.exe 0xC00000005 Access violation

Kan det skyldes, at det første Buff bliver til, er første linje i min txt fil!
Avatar billede djmaster Nybegynder
01. marts 2007 - 11:07 #14
Samme fejl i debuggeren ved: while (fgets(Buff, 15, f)!=NULL)
Avatar billede yates Nybegynder
01. marts 2007 - 11:07 #15
Prøvede du med den opdaterede version (10:59:37) ?
Avatar billede yates Nybegynder
01. marts 2007 - 11:08 #16
Hmmm...
prøv lige at ændre første linje til
char* Buff=malloc(16);
Avatar billede djmaster Nybegynder
01. marts 2007 - 11:08 #17
stadig fejl
Avatar billede djmaster Nybegynder
01. marts 2007 - 11:10 #18
så virker det.

ændrede int arrVals[19]; til int arrVals[20];

Men tak for hjælpen, det var fornemt, smid et svar
Avatar billede yates Nybegynder
01. marts 2007 - 11:11 #19
Hej, jeg samler ikke points. Bare glad for jeg kunne hjælpe lidt.
Og ja, selvfølgelig skal der stå int arrVals[20] i stedet for [19]. Hjerdedødt, men godt du fandt ud af det.

VH
Y.
Avatar billede djmaster Nybegynder
01. marts 2007 - 11:14 #20
Okay.

Du var i hvert fald en stor hjælp
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