Avatar billede ares Nybegynder
06. september 2007 - 14:50 Der er 10 kommentarer og
1 løsning

Cast without pointer

Har en tekstfil efter følgende format...

id (heltal)
code (tekst)
name (tekst)
amout (decimaltal)

Jeg forsøger at indlæse filen til et array... men får et par fejlmeddelser... Er der en der kan forklarer hvad der går galt...

Koden...

typedef struct
{
    int id;
    float amount;
    char name[45];
    char code[3];
}Rate;

int main(void)
{
    Rate rate[10];
    int index = 0;

    FILE *fp;
    fp = fopen("c:\\valuta.txt","r");
   
    while(!feof(fp))
    {
      fgets(rate[index].id, 256, fp);        //256 er "max number of bytes to be read."
      fgets(rate[index].name, 256, fp);
      fgets(rate[index].code, 256, fp);
      fgets(rate[index].amount, 256, fp);
      index++;
    }
    fclose(fp);
}

på forhånd tak..

ares
Avatar billede arne_v Ekspert
06. september 2007 - 15:01 #1
Hvis det er en tekst fil boer du bruge fscanf eller en enkelt fgets og saa strncpy
og atoi de enkelte felter.
Avatar billede ares Nybegynder
06. september 2007 - 16:12 #2
hmmm... ok... det prøver jeg lige at rode lidt med... ;)

Skal jeg bruge atoi på alle felter eller kun på dem der holder talværdier ?

Ares
Avatar billede arne_v Ekspert
06. september 2007 - 16:33 #3
atoi for integer
atof for fp
ikke for strings
Avatar billede ares Nybegynder
06. september 2007 - 17:50 #4
Ok... hvorfor får jeg ingen fejl hvis jeg ændre alt i typedefintionen til char...


Ares
Avatar billede bertelbrander Novice
06. september 2007 - 20:59 #5
Hvis det er C++ ville det være lettere med:

#include <fstream>
#include <iostream>

struct Rate
{
  int id;
  float amount;
  char name[45];
  char code[3];
};

std::istream& operator >> (std::istream& is, Rate& rate)
{
  is >> rate.id;
  is >> rate.code;
  is >> rate.name;
  is >> rate.amount;
  return is;
}

std::ostream& operator << (std::ostream& os, Rate& rate)
{
  os << rate.id << std::endl;
  os << rate.amount << std::endl;
  os << rate.name << std::endl;
  os << rate.code << std::endl;
  return os;
}

int main(void)
{
  Rate rate[10];
  std::ifstream In("c:\\valuta.txt");
  if(!In)
      std::cout << "Did not open" << std::endl;
  int idx;
  for(idx = 0; idx < 10 && In >> rate[idx]; idx++)
  {}
  for(int i = 0; i < idx; i++)
      std::cout << rate[i];
}
Avatar billede arne_v Ekspert
07. september 2007 - 04:34 #6
Jeg tror at den giver problemer med mellemrum i navn.
Avatar billede ares Nybegynder
07. september 2007 - 08:09 #7
Kan jeg lokke en af jer til at komme med et eksempel på hvordan I ville gøre det, i C.

Ares
Avatar billede bertelbrander Novice
07. september 2007 - 20:40 #8
I C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Rate
{
  int id;
  float amount;
  char name[45];
  char code[3];
};

int main(void)
{
  Rate rate[10];
  int idx, nof;
  char Buffer[100], *p;

  FILE *f = fopen("c:\\valuta.txt", "rt");
  if(!f)
  {
      printf("Failed to open the file\n");
      return 0;
  }
  for(idx = 0; idx < 10 && fgets(Buffer, sizeof(Buffer), f); idx++)
  {
      rate[idx].id = strtol(Buffer, 0, 10);
      fgets(Buffer, sizeof(Buffer), f);
      if((p = strchr(Buffer, '\n')) != 0)
        *p = 0;
      strcpy(rate[idx].code, Buffer);
      fgets(Buffer, sizeof(Buffer), f);
      if((p = strchr(Buffer, '\n')) != 0)
        *p = 0;
      strcpy(rate[idx].name, Buffer);
      fgets(Buffer, sizeof(Buffer), f);
      rate[idx].amount = strtod(Buffer, 0);
  }
  fclose(f);
  nof = idx;
  for(idx = 0; idx < nof; idx ++)
  {
      printf("%d\n%f\n%s\n%s\n\n", rate[idx].id, rate[idx].amount, rate[idx].name, rate[idx].code);
  }
}
Avatar billede ares Nybegynder
13. september 2007 - 20:20 #9
Smid lige nogle svar...
Avatar billede bertelbrander Novice
13. september 2007 - 20:29 #10
Jeg samler ikke på point.
Avatar billede arne_v Ekspert
14. september 2007 - 01:21 #11
svar
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