Kopiowanie liczb z pliku do tablicy

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;
} 
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]);
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?

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.
0

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

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;
  } 
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;
} 
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]);
  }
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.
0
  1. No każdy znak nie będący spacją, tabulatorem lub znakiem nowej lini?
  2. To jak inicjalizować tablicę wskaźników?
0
  1. Faktycznie zamiast || powinno być &&.
1

Do wyboru, do koloru:

  1. char wyrazy[100][20];
  2. char *wyrazy[100]; + wyrazy[i]=strdup(wyraz);
  3. char **wyrazy; + wyrazy=malloc(n*sizeof(char*)); + wyrazy[i]=strdup(wyraz);
  4. char **wyrazy; + wyrazy=malloc(n*sizeof(char*)); + wyrazy[i]=malloc(strlen(wyraz)+1);
0

Wywala bład w 19 linii.

#include<stdio.h>

char wyraz[20] = {0};
char c;
int i = 0;
char wyrazy[100][20];
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;
} 
0

Zadziałało. Wrzucam, może komuś kiedyś się przyda. Dzięki za pomoc! :)

#include<stdio.h>

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

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

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

  fclose(plik);
  return 0;
} 
0
Czarny Kot napisał(a):

Wrzucam, może komuś kiedyś się przyda.
Nie sądzę, ponieważ to się zapisuje o wiele prościej:

#include <stdio.h>
#include <assert.h>
 
int main()
  {
   static char tb[1000][20];
   unsigned i,rows=0;
   FILE *fd;
   assert(fd=fopen("plik.txt","r"));
   while((rows<1000)&&(fscanf(fd,"%19s",tb[rows])==1)) ++rows;
   fclose(fd);
   for(i=0;i<rows;++i) printf("%s\n",tb[i]);
   return 0;
  }

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