[C] odczyt z pliku i wpisuwanie do tablicy

lucki001
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 8 lut 2008, o 20:44
Płeć: Mężczyzna
Lokalizacja: Gliwice

[C] odczyt z pliku i wpisuwanie do tablicy

Post autor: lucki001 »

Witam

Mialbym do was nastepujace pytanko.
Otoz mam problem , potrzebuje napisac funkcje , ktora sczytuje dane z pliku i wpisuje je do tablicy dwuwymiarowej.

Czyli mamy np. taka macierz zapisana w pliku tekstowym "macierz" :

Kod: Zaznacz cały

 3   2    1    
 4   2    2  

Funckja musi wczytac te dane do tablicy dwuwymiarowej.

Z gory dzieki za pomoc
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C] odczyt z pliku i wpisuwanie do tablicy

Post autor: soku11 »

Czy ta macierz bedzie zawsze dwuwymiarowa?? I czy bedzie miala jakies z gory ustawione wymiary ?? Czy zapis jest binarny, czy tekstowy ?? Pozdrawiam.
lucki001
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 8 lut 2008, o 20:44
Płeć: Mężczyzna
Lokalizacja: Gliwice

[C] odczyt z pliku i wpisuwanie do tablicy

Post autor: lucki001 »

Macierz bedzie zawsze dwuwymiarowa , ktora podaje sie dynamicznie. W pliku jest zapisana tekstowo nie binarnie .

P.S

Mialbym takie dodatkowe pytanie:

Jak np. zrobic zeby funkcja z czytala z pliku np. licze 23 i zapisala ja do zmiennej int.
Bo gdy czyta z pliku jest to zmienna char i nie da sie ja potem przypisac do inta.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C] odczyt z pliku i wpisuwanie do tablicy

Post autor: soku11 »

No to jeszcze odpowiedz na to drugie pytanie odnosnie wymiarow. Czy jesli mamy plik:

Kod: Zaznacz cały

3 2 1 4 3
0 5 3 2 6
To bedzie to tablica 5x2, a jesli:

Kod: Zaznacz cały

5 5 5
5 3 5
5 5 5
To bedzie 3x3. Tak ?? Dodatkowo, czy rozmiar jest w jakis sposob podawany(moze na poczatku pliku jest np. szerokosc i wysokosc), czy trzeba recznie sprawdzac przeszukujac caly plik ??

Do konwersji sluzy np. atoi. Pozdrawiam.
lucki001
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 8 lut 2008, o 20:44
Płeć: Mężczyzna
Lokalizacja: Gliwice

[C] odczyt z pliku i wpisuwanie do tablicy

Post autor: lucki001 »

To co napisales zgadza sie

rozmiar macierzy nie bedzie podawany tylko poprzez sprawdzanie pliku , trzeba dojsc jaka to bedzie macierz.

to jest macirze

Kod: Zaznacz cały

5 5 5
5 3 5
5 5 5 
wiec program funkcja bedzie musiala sama zliczac wysokosc i szerkosc.
Pozdrawiam:)
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

[C] odczyt z pliku i wpisuwanie do tablicy

Post autor: spajder »

schemat: po otwarciu pliku każdą linię czytasz:

Kod: Zaznacz cały

linia = plik.getline();
teraz możesz utworzyć obiekt typu stringstream:

Kod: Zaznacz cały

stringstream* strumien = new stringstream(linia)
i możesz go odczytywać zwykłym cin:

Kod: Zaznacz cały

int nr = 0;
while(!strumien.oef()){
   strumien >> wartosc;
   nr++;
}
zmienna wartość zawiera teraz kolejne wartości komórek z danego wiersza, a nr zawiera nr kolumny. Po zakończeniu pętli w nr będzie ilość kolumn.
Oczywiście to tylko zarys, jak coś będzie niejasne to pisz (albo patrz po dokumentacji)
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C] odczyt z pliku i wpisuwanie do tablicy

Post autor: soku11 »

Prosty kod bez sprawdzania bledow w skaldni itd dzialacy tylko dla liczb jednocyfrowych ;P Mozesz go pokombinowac i pozamieniac na wlasne potrzeby :)

Kod: Zaznacz cały

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

long OpenFile(FILE** File);
void GetSize(FILE* File,int* Width,int* Height);
int CreateMatrix(int*** Matrix,int Width,int Height);
void LoadMatrix(FILE* File,int*** Matrix,int Width,int Height);
void ShowMatrix(int** Matrix,int Width,int Height);
void DeleteMatrix(int*** Matrix,int Width);

int main()
{
  FILE* File=NULL;
  long FileLength=0;
  int** Matrix=NULL;
  int Width=0;
  int Height=0;


  if((FileLength=OpenFile(&File))==-1)
    return 0;

  GetSize(File,&Width,&Height);
  if(CreateMatrix(&Matrix,Width,Height)==-1)
    return 0;


  LoadMatrix(File,&Matrix,Width,Height);
  ShowMatrix(Matrix,Width,Height);
  DeleteMatrix(&Matrix,Width);

  return 0;
}


long OpenFile(FILE** File)
{
  char FileName[30]={0};
  long FileLength=0;
  *File=NULL;

  printf("Podaj nazwe pliku do otwarcia: ");
  scanf("%29s",FileName);


  *File=fopen(FileName,"rt");
  if(!(*File))
  {
    printf("Nie mozna otworzyc pliku %s.",FileName);
    return -1;
  }

  fseek(*File,0,SEEK_END);
  FileLength=ftell(*File);
  fseek(*File,0,SEEK_SET);

  return FileLength;
}

void GetSize(FILE* File,int* Width,int* Height)
{
  int WidthRead=0;
  char Tmp=0;

  *Width=0;
  *Height=1;
  while(1)
  {
    if(feof(File))
      break;
    Tmp=fgetc(File);

    if(WidthRead==0)
    {
      if(Tmp=='\n')
      {
        WidthRead=1;
        ++(*Height);
      }
      else if(Tmp!=' ')
        ++(*Width);
    }
    else if(Tmp=='\n')
      ++(*Height);
  }

  fseek(File,0,SEEK_SET);
}

int CreateMatrix(int*** Matrix,int Width,int Height)
{
  int i=0;

  *Matrix=(int**) malloc(Width*sizeof(int*));
  if(!(*Matrix))
  {
    printf("Blad allokacji pamieci.");
    return -1;
  }

 for(i=0;i<Width;++i)
    (*Matrix)[i]=NULL;

  for(i=0;i<Width;++i)
    (*Matrix)[i]=(int*) malloc(Height*sizeof(int));

  for(i=0;i<Width;++i)
    if((*Matrix)[i]==NULL)
      return -1;


  return 0;
}

void LoadMatrix(FILE* File,int*** Matrix,int Width,int Height)
{
  int i=0;
  int j=0;
  char Tmp=0;

  if(!File || !(*Matrix) || Width<0 || Height<0)
    return;

  for(i=0;i<Height;++i)
    for(j=0;j<Width*2;++j)
    {
      Tmp=fgetc(File);
      if(j%2==0)
        (*Matrix)[j/2][i]=Tmp-'0';
    }

}

void ShowMatrix(int** Matrix,int Width,int Height)
{
  int i=0;
  int j=0;

  for(i=0;i<Height;++i)
  {
    for(j=0;j<Width;++j)
      printf("%d ",Matrix[j][i]);
    printf("\n");
  }
}

void DeleteMatrix(int*** Matrix,int Width)
{
  int i=0;

  if(!*Matrix)
    return;

  if(Width<0)
    return;

  for(i=0;i<Width;++i)
    free((*Matrix)[i]);

  free(*Matrix);
}

spajder, to ma byc w C... Pozdrawiam.
lucki001
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 8 lut 2008, o 20:44
Płeć: Mężczyzna
Lokalizacja: Gliwice

[C] odczyt z pliku i wpisuwanie do tablicy

Post autor: lucki001 »

Wielkie dzieki za pomoc
diabollo
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 30 sie 2009, o 12:55
Płeć: Mężczyzna
Podziękował: 6 razy
Pomógł: 1 raz

[C] odczyt z pliku i wpisuwanie do tablicy

Post autor: diabollo »

Witam,
Odnowie trochę temat. Mam problem z otwieraniem iluś plików w pętli oto kod:

Kod: Zaznacz cały

#include <stdio.h> 

int main( void ) 
{ 
    char NOWA_LINIA[1],a2[10]={0};
    int i;
    
    //system("PAUSE");  

    for(i=1;i<4;i++)
    {
        a2[i]=;
        
        FILE *plik = fopen(a2, "rt" );
        
        if ( plik == 0 ) 
        { 
             printf("Nie mozna otworzyc pliku: %d 

",a2[i]); 
        } 
        else 
        { 
            while( !feof( plik ) ) 
            {
                 printf( "%c", fgetc( plik ) ); 
            }
            sleep(1000);
            fclose( plik ) ;
        }
        
        printf("


");  
    }
    
      
   // printf("
KONIEC 

%s", NOWA_LINIA);
    
    system("PAUSE");
    return 0; 
}

Proszę o pomoc.
popiolek1
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 23 kwie 2015, o 12:34
Płeć: Mężczyzna
Lokalizacja: Polska

[C] odczyt z pliku i wpisuwanie do tablicy

Post autor: popiolek1 »

Witam,

próbowałem zrobić lekką modyfikację kodu znajdującego się u góry
jednak napotkałem pewien problem

tworzona na podstawie danych w pliku tekstowego tablica wyświetla same 0.000 a chciałbym żeby przetrzymywała wartości z tablicy mat bo chciałbym wykonywać na niej później modyfikacje

dodam że próbowałem przepisywać elementy z tablicy mat do Matrix ale nie za bardzo działa

może jakieś sugestie
Pozdrawiam

PS. przykładowe dane do pliku tekstowego "dane.txt" który trzeba utworzyć
macierz bazowa i prawe strony równania do metody bazowej
2 3 1 0 0 18
4 1 0 1 0 16
2 1 0 0 -1 2

Kod: Zaznacz cały

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

void wczytywanie_danych(void);
long otworz_plik(FILE** File);
void pobierz_rozmiar(FILE* File,int* Width,int* Height);
int stworz_macierz(int*** Matrix,int Width,int Height);
float wczytaj_macierz(FILE* File,int*** Matrix,int Width,int Height);
void pokaz_macierz(int** Matrix,int Width,int Height);
void usun_macierz(int*** Matrix,int Width);

int main()
{
  FILE* plik=NULL;
  long dlugosc_pliku=0;
  int** Matrix=NULL;
  int Width=0;
  int Height=0;
  
	otworz_plik(&plik);
	pobierz_rozmiar(plik,&Width,&Height);
	stworz_macierz(&Matrix,Width,Height);
	wczytaj_macierz(plik,&Matrix,Width,Height);
	pokaz_macierz(Matrix,Width,Height);
//	usun_macierz(&Matrix,Width);
	fclose(plik);

  return 0;
}


long otworz_plik(FILE** plik){
	char nazwa_pliku_do_otwarcia[30] = {0};
	long dlugosc_pliku = 0;
	
	*plik = NULL;
	printf("PODAJ NAZWE PLIKU Z DANYMI: ");
	scanf("%29s",nazwa_pliku_do_otwarcia);
	
	*plik = fopen(nazwa_pliku_do_otwarcia, "rt");
	 if(!(*plik)) {
    	printf("NIE MOZNA OTWORZYC PLIKU %s.",nazwa_pliku_do_otwarcia);
    return -1;
	}
	
	fseek(*plik,0,SEEK_END);
  	dlugosc_pliku=ftell(*plik);
  	fseek(*plik,0,SEEK_SET);

  return dlugosc_pliku;
  	
}

void pobierz_rozmiar(FILE* plik, int* Width,int* Height){
	    int symbol  = 0,
        columns = 0,
        rows    = 0;
	
	if (plik != NULL){
        do{
            symbol = fgetc(plik);
            if (rows == 0 && (isspace(symbol) || feof(plik))){
                columns++;
            }
            if (symbol == '\n' || feof(plik)){
                rows++;
            }
        }
        while (symbol != EOF);

        if (ferror(plik)){
            printf("BRAD ODCZYTU PLIKU.\n");
        }

        else{
            printf("PLIK ZAWIERA %d WIERSZY %d KOLUMN.\n", rows, columns);
        }
    }

    else{
        perror("BLAD OTWARCIA PLIKU");
    }
    
    *Width = columns;
    *Height = rows;

}

int stworz_macierz(int*** Matrix,int Width,int Height)
{
  int i=0;

  *Matrix=(int**) malloc(Width*sizeof(int*));
  if(!(*Matrix))
  {
    printf("Blad allokacji pamieci.");
    return -1;
  }

 for(i=0;i<Width;++i)
    (*Matrix)[i]=NULL;

  for(i=0;i<Width;++i)
    (*Matrix)[i]=(int*) malloc(Height*sizeof(int));

  for(i=0;i<Width;++i)
    if((*Matrix)[i]==NULL)
      return -1;


  return 0;
}

float wczytaj_macierz(FILE *plik, int*** Matrix,int Width,int Height){
	
	int rows = 	Height;
	int cols = Width;
	
	char *buffer;
	int  ret,row=0,i,j;
	char *result=NULL;
	char delims[]=" \t";
	
	float **mat = malloc( rows*sizeof(float*));
    for(i = 0; i < rows; i++) 
    	mat[i] = malloc( cols*sizeof(float));
	

	if ((plik = fopen("dane.txt", "r")) == NULL){
    	fprintf(stdout, "Error: Can't open file !\n");
	}
	
    while(!feof(plik)){
    	buffer = malloc(sizeof(char) * 4096);
        memset(buffer, 0, 4096);
        ret = fscanf(plik, "%4095[^\n]\n", buffer);
        if (ret != EOF) {
            int field = 0;
            result = strtok(buffer,delims);
                while(result!=NULL){
                    if(field>10 )break;
                    mat[row][field]=atof(result);    
                    result=strtok(NULL,delims);
                    field++;
                }
            ++row;            
        }
    	free(buffer);
    }
    //fclose(plik);
    i = 0;
    j = 0;
 	for(i=0;i<rows;i++){
        for(j=0;j<cols;j++)
            printf("%.3f%s",mat[i][j], j < cols-1 ? "\t" : "\n");
            free(mat[i]);
        }    
       free(mat);  
}

void pokaz_macierz(int** Matrix,int Width,int Height)
{
  int i=0;
  int j=0;
  	printf("\n\n");
     for(i=0;i<Height;i++){
        for(j=0;j<Width;j++)
            printf("%.3f%s",Matrix[i][j], j < Width-1 ? "\t" : "\n");
            free(Matrix[i]);
    }    
        free(Matrix);        
}


void usun_macierz(int*** Matrix,int Width)
{
  int i=0;

  if(!*Matrix)
    return;

  if(Width<0)
    return;

  for(i=0;i<Width;++i)
    free((*Matrix)[i]);

  free(*Matrix);
}

ODPOWIEDZ