Kopiowanie liczb z pliku do tablicy

Odpowiedz Nowy wątek
2014-12-16 16:24
Czarny Kot
0

Mam do napisania program który kopiuj liczby całkowitej z pliku do tablicy dynamicznie alokowanej. Liczby całkowite znajdują się w l_c.txt oddzielone spacjami. Po uruchomieniu wypisuje 5 zer mimo że w pliku jest 10 liczb całkowitych róznych od 0. Gdzie jest błąd?

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

int main()
{
  int i = 0;
  int l;
  int *tab;
  FILE *l_c;

  if((l_c = fopen("l_c.txt", "r")) != NULL) 
    while(fscanf(l_c, "%d", &l) == 1) 
      i++;
  else
    return -1;

  tab = (int *)malloc(sizeof(int) * i);

  i = 0;
  while(fscanf(l_c, "%d", &l) == 1) {
    tab[i] = l;
    i++;
  }

  for(i = 0; i < sizeof(tab) ; i++) 
    printf("%d, ", tab[i]);
  printf("\n");

  fclose(l_c);
  return 0;
} 

Pozostało 580 znaków

2014-12-16 16:39
0

Kurs "debuggowania":

  printf("W pliku jest %d liczb\n", i);
  tab = (int *)malloc(sizeof(int) * i);

  i = 0;
  while(fscanf(l_c, "%d", &l) == 1) {
    printf("wczytano liczbe %d pod indeks %d", l, i);
    tab[i] = l;
    i++;
  }

  printf("tab ma %d elementow, natomiast sizeof zwraca liczbe %d\n", i, sizeof(tab));
  for(i = 0; i < sizeof(tab) ; i++) 
    printf("%d, ", tab[i]);

Pozostało 580 znaków

2014-12-16 16:50
Czarny Kot
0

Już mi działa. Dzięki! Czy to było wynikiem tego, że nie zamknęłam l_c i nie otworzyłam go ponownie przed drugim wywołaniem fscanf?

Pozostało 580 znaków

2014-12-16 16:57
0

Były 2 problemy:
1) Po pierwszym przejściu fscanf() jesteś już na końcu pliku, więc kolejne próby czytania oczywiście nie dają wyniku. Zamiast zamknąć/otworzyć ponownie można też używać fseek() do ustawiania pozycji na początek pliku.
2) tab to nie jest tablica, tylko wskaźnik, więc sizeof(tab) to sizeof(int*), czyli 4.

Pozostało 580 znaków

2014-12-16 16:58
Czarny Kot
0

Ok, już wszystko jest dla mnie jasne. Dzięki!

Pozostało 580 znaków

2014-12-16 17:41
0

Może zastanów się nad takim kodem:

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

int main()
  {
   unsigned i,count=0,capacity=16;
   int value,*tab=malloc(capacity*sizeof(int));
   FILE *fd=fopen("l_c.txt","r");
   for(assert(fd);fscanf(fd," %d",&value)==1;tab[count++]=value) if(count>=capacity) tab=realloc(tab,(capacity<<=1)*sizeof(int));
   tab=realloc(tab,count*sizeof(int));
   for(i=0;i<count;++i)  printf(", %d"+!i,tab[i]);
   printf("\n");
   fclose(fd);
   return 0;
  } 

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-16 18:17
Czarny Kot
0

Jeszcze jeden program. Ma zapisywać wyrazy z pliku txt w tablicy łańcuchów znaków. Kompiluje się, jednak po uruchomieniu nic nie wyświetla. Po sprawdzeniu doszłam do tego, że w ogóle nie przeskakuje do else'a. Jak to poprawić?

#include<stdio.h>

char wyraz[20] = {0};
char c;
int i = 0;
char *wyrazy[100];
int j = 0;
int n;

int main() {
  FILE *plik;
  if((plik = fopen("plik.txt", "r")) != NULL) {
    while((c = fgetc(plik)) != EOF) {
      if(c != ' ' || c != '\t' || c != '\n') {
        wyraz[i] = c;
        i++;
      } else {
        wyrazy[j] = wyraz;
        j++;
          for(n = 0; n < i; n++) {
            wyraz[n] = 0;
          }
        i = 0;
      }
    }
  } else
    return -1;

  for(i = 0; i < j; i++) {
    printf("%d", j);
  }

  fclose(plik);
  return 0;
} 

Pozostało 580 znaków

2014-12-16 18:19
Czarny Kot
0

Ta ostatnia pętla for miała wyglądać w ten sposób:

  for(i = 0; i < j; i++) {
    printf("%s\n", wyrazy[j]);
  }

Pozostało 580 znaków

2014-12-16 18:39
0
  1. Czy możesz podać mi jaki znak spełni warunek: if(c != ' ' || c != '\t' || c != '\n')
  2. Nie możesz kopiować nic do char *wyrazy[100]; ponieważ wskaźniki nie są zainicjalizowane.

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-16 18:44
Czarny Kot
0
  1. No każdy znak nie będący spacją, tabulatorem lub znakiem nowej lini?
  2. To jak inicjalizować tablicę wskaźników?

Pozostało 580 znaków

2014-12-16 18:52
Czarny Kot
0
  1. Faktycznie zamiast || powinno być &&.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0