Avatar billede venja Nybegynder
17. marts 2003 - 16:53 Der er 19 kommentarer og
1 løsning

atoi

Jeg ønsker at indlæse (char)data fra en .txt-fil og lægge dem i et array og dernæst konvertere de data jeg har i mit array til int - er der nogen der har en nem måde at gøre dette på ?
(et stykke kode er meget velkomment)
Avatar billede arne_v Ekspert
17. marts 2003 - 16:59 #1
#include <stdio.h>
#include <stdlib.h>

#define N 6

int main()
{
  FILE *fp;
  int i;
  char sa[N][10];
  int ia[N];
  fp = fopen("z.z", "r");
  for(i=0;i<N;i++) fscanf(fp,"%s",sa[i]);
  fclose(fp);
  for(i=0;i<N;i++) ia[i]=atoi(sa[i]);
  for(i=0;i<N;i++) printf("%s %d\n",sa[i],ia[i]);
}


kan læse en fil:

1
2 3
4 5 6
Avatar billede arne_v Ekspert
17. marts 2003 - 17:01 #2
Men du behøver ikke læse det ind som streng først.

Følgende kan også læse tallene:

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

#define N 6

int main()
{
  FILE *fp;
  int i;
  int ia[N];
  fp = fopen("z.z", "r");
  for(i=0;i<N;i++) fscanf(fp,"%d",&ia[i]);
  fclose(fp);
  for(i=0;i<N;i++) printf("%d\n",ia[i]);
}
Avatar billede venja Nybegynder
17. marts 2003 - 17:22 #3
Jeg får godt nok en værdi ud af det, men det er den værdi der default ligger i "int i" (i dette tilfælde -858993460) jeg kan ikke umiddelbart se hvor der kan være en fejl.....
Avatar billede olennert Nybegynder
17. marts 2003 - 17:23 #4
Kan også gøres med streams:

#include <iostream>
#include <fstream>
const int N = 6;

int main() {
  std::ifstream indput("z.z");
  int i(0), ia[N];
  while (!indput.eof() && i < N) indput >> ia[i++];
  for (int j = 0; j < i; ++j) std::cout << ia[j] << std::endl;
  return 0;
}
Avatar billede arne_v Ekspert
17. marts 2003 - 17:24 #5
Det var lidt pudsigt, da det kører hos mig:

C:\>z1
1 1
2 2
3 3
4 4
5 5
6 6

C:\>z2
1
2
3
4
5
6

(z1 er den første version og z2 er den anden version)
Avatar billede arne_v Ekspert
17. marts 2003 - 17:26 #6
Kan du lige poste programmet som det ser ud når du kører det ?
Avatar billede arne_v Ekspert
17. marts 2003 - 17:27 #7
Hvilken compiler bruger du ?
Avatar billede venja Nybegynder
17. marts 2003 - 17:28 #8
hmm - jeg skriver system datoen til en teksfil som char : 03/17/03 - dette vil jeg læse ud som int... - dvs -jeg vil bruge d.d. "03" som ref. til starten af en graf i MFC
Avatar billede arne_v Ekspert
17. marts 2003 - 17:29 #9
Nå.

Der er ikke mellemrum mellem tallene !

Så skal du have pillet tallene ud.
Avatar billede venja Nybegynder
17. marts 2003 - 17:31 #10
#define DATA "måledata.txt"

void CTal1Dlg::OnTal()
{
FILE *fp;

char x[8];
_strdate(x);

char y[9];
_strtime(y);

fp=fopen(DATA,"w");
fwrite(x,sizeof(x),1,fp);
fwrite(y,sizeof(y),1,fp);
fwrite("\0",1,1,fp);
fclose(fp);
}

void CTal1Dlg::OnHent()
{
FILE *fp;
  int i=0;
  int fil[16];
  fp = fopen(DATA, "r");
  for(i=0;i<16;i++)
      fscanf(fp,"%d",&fil[i]);
  fclose(fp);

  for(int j=0;j<16;j++)
    printf("%d\n",fil[j]);

UpdateData(FALSE);
}

- jeg skriver og kompilerer koden i VC++ 6.0
Avatar billede venja Nybegynder
17. marts 2003 - 17:34 #11
til Olennert: jeg kan ikke bruge commands som cin og cout i mFC
Avatar billede arne_v Ekspert
17. marts 2003 - 17:35 #12
Input:

03/17/03
04/17/03

Program:

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

#define N 2

int main()
{
  FILE *fp;
  int i,n;
  char line[80];
  int d[N],m[N],y[N];
  fp = fopen("zz.zz", "r");
  for(i=0;i<N;i++) {
      fscanf(fp,"%s",line);
      y[i]=atoi(line+6);
      line[5]='\0';
      d[i]=atoi(line+3);
      line[2]='\0';
      m[i]=atoi(line);
  }
  fclose(fp);
  for(i=0;i<N;i++) printf("%d %d %d\n",d[i],m[i],y[i]);
}

Output:

C:\>zz1
17 3 3
17 4 3
Avatar billede arne_v Ekspert
17. marts 2003 - 17:36 #13
Ovenstående læser linier ind i formatet:
mm/dd/yy
Avatar billede arne_v Ekspert
17. marts 2003 - 17:37 #14
lennarts brug af cout er bare for at demo'e du skal jo kune
bruge værdien i dit program.
Avatar billede arne_v Ekspert
17. marts 2003 - 17:38 #15
Jeg laver et lille dirty trick for at undgå at kopiere dele
af linien ved at jeg tager tallene bagfra og sætter en nul byte
ind når jeg er færdig med data.

Jeg håber at du kan følge min tanke-gang.
Avatar billede olennert Nybegynder
17. marts 2003 - 17:39 #16
venja -> Det lyder som et godt argument for at skifte til en anden oversætter.

Streams er en del af standard C++. Så iostream og fstream headers bør være tilgængelige. Måske hedder de iostream.h og fstream.h? Hvis ja, så skal du ikke have std:: foran cin, endl og ifstream.
Avatar billede olennert Nybegynder
17. marts 2003 - 17:40 #17
Som sædvanlig er Arne for hurtig for mig :-)
Avatar billede venja Nybegynder
17. marts 2003 - 17:41 #18
1000 Tak - jeg er endnu temmelig rusten, men jeg får da lidt større indblik i hvad man kan og ikke kan vha dette forum - takker !
Avatar billede segmose Nybegynder
17. marts 2003 - 17:57 #19
Se også http://www.eksperten.dk/spm/329220 for en diskussion om validiteten af det indlæste.
Avatar billede venja Nybegynder
17. marts 2003 - 18:01 #20
mange tak for hjælpen alle tre !
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