Bufor/dynamiczna alokacja pamięci

0

Witam. Chciałbym dostać jakieś porady i trochę wytłumaczenia. Mam nadzieję że pomożecie. Jestem początkujący, a w języku C to już kompletnie zielony.
Przejdę do sedna. Mam napisać program który pobiera wyrazy, obcina je do 10 znaków i umieszcza w buforze/pamięci alokowanej dynamicznie. Jeśli brakuje miejsca w tej pamięci zwiększa ją dwukrotnie i zapisuje ten bufor do pliku.Nie wiem za bardzo jak zrobić z tym buforem i go zwiększać. Prześle na razie mój kod może coś mi poradzicie i pomożecie. z góry dzięki.

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

int main(int argc, char *argv[]) 
{
	FILE *plik;
	int i;
	int size=256,size2=25;
	char *wyraz;
	wyraz=(char*) calloc(size2,sizeof(char));
	void clearCharBuff( char * wyraz );
	{
    for( i = 0; i < 24; i++ )
    {
        wyraz[ i ] = '\0';
      	//printf("wyraz=\n",wyraz[i]);
    }
}
	plik=fopen("znaki.txt","w");
	
	if(plik==NULL)
	{
		printf("Nie da sie otworzyc pliku!");
	}
	
	printf("Podaj kilka/kilkadziesiat wyrazow.Jesli chcesz zakonczyc wcisnij ENTER\n");
	
	while(strlen(gets(wyraz))>0) 
	{
	wyraz[10]='\0';
	fputs(wyraz,plik);
	fputs("\n",plik);
	fflush( plik );
	printf("Podaj kolejny wyraz lub zakoncz ENTER-em\n");
	}
	fclose(plik);
	
	return 0;
} 
0

bufor to nie pamiec (w tym przypadku o ktorym piszesz) chodzi Ci o pamiec

pomysl w ten sposob

masz tablice zadeklarowana ze moze przyjac 50 elementow. Dodajesz sobie ciagle na sam koniec. Ale w koncu chcesz dodac 51 element. Oczywiscie nie mozesz tego zrobic. Wiec co powinienes zrobic?

Tworzysz druga tablice o rozmiarze 100 (dwukrotnie wieksza). Przepisujesz wszystkie wartosci z 50 elementowej tablicy do tej o rozmiarze 100. Nastepnie zwalniasz pamiec po tej 50 elementowej tablicy.

Jak sprawdzic czy rozmiar zostal przekroczony? Musisz gdzies miec zapisana informacje o aktualnej wielkosci tablicy. Na poczatku byloby to 50 pozniej byloby to 100.

Robisz prostego ifa

if( sizeOfArray < positionToBePlaced)
{
  ResizeArray();
}
1

Nie zadałeś pytania, ale na szybo:

  1. nie zwalniasz pamięci na "wyraz"
  2. nie używaj gets a fgets z handlerem na stdin
  3. co to jest void clearCharBuff( char * wyraz );
    Reszta, jak zadasz konkretne pytanie.
0

Czyli ta funkcja calloc lub inne funkcja nie są potrzebne tylko trzeba powiększać rozmiar tablicy kiedy zostaje przekroczony? Tylko nie za bardzo wiem jak zrobić w tym warunku z tą pozycją.

0

Obecnie mój program wygląda tak:

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

void clearCharBuff( char * znaki );
int main(int argc, char *argv[]) 
{
	FILE *plik;
	int i;
	int size=25;
	char *wyraz;
	wyraz= calloc(size,sizeof(char));
	clearCharBuff(wyraz);

	plik=fopen("znaki.txt","w");
	
	if(plik==NULL)
	{
		printf("Nie da sie otworzyc pliku!");
	}
	
	printf("Podaj kilka/kilkadziesiat wyrazow.Jesli chcesz zakonczyc wcisnij ENTER\n");
	
	while(fgets(wyraz,size,stdin))
	{
/*	if()
	{
		printf("Powiekszanie bufora\n");
		size*=2;
	}
	*/
	wyraz[10]='\0';
	fputs(wyraz,plik);
	fputs("\n",plik);
	fflush( plik );
	printf("Podaj kolejny wyraz lub zakoncz ENTER-em\n");
	}
	
	free(wyraz);
	fclose(plik);
	return 0;
}
void clearCharBuff( char * znaki )
	{
		int i;
    for( i = 0; i < 24; i++ )
    {
        znaki[ i ] = '\0';
      	//printf("wyraz=\n",wyraz[i]);
    }
	} 

Nie wiem za bardzo jaki dać warunek żeby powiększyć bufor.Ktoś coś?

0

Z uwag - jak dajesz calloc, to nie musisz czyścić, bo jest wyczyszczony bufor. A jak juz chcesz czyscic, to lepiej uzyc memset.

0

Teraz wygląda tak, ale chyba nie działa do końca poprawnie :(

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


int main(int argc, char *argv[]) 
{
	FILE *plik;
	int i,j;
	int size=25;
	char *wyraz,koniec;
	wyraz= calloc(size,sizeof(char));

	plik=fopen("znaki.txt","w");
	
	if(plik==NULL)
	{
		printf("Nie da sie otworzyc pliku!");
	}
	
	printf("Podaj kilka/kilkadziesiat wyrazow.Jesli chcesz zakonczyc nacisnij ENTER\n");
	
	while(fgets(wyraz,size,stdin))
	{
	
	if(wyraz[0]=='\n')
	{
		goto koniec;
	}
	if(wyraz[24]!='\n' && wyraz[strlen(wyraz) - 1]!='\n')
	{
		printf("Powiekszanie bufora\n");
		size*=2;
	}
	wyraz[10]='\0';
	fputs(wyraz,plik);
	fputs("\n",plik);
	fflush( plik );
	printf("Podaj kolejny wyraz lub zakoncz ENTER-em\n");
	}
	koniec:
	free(wyraz);
	fclose(plik);
	return 0;
} 

Wpiszę np 25 znak i mi kończy program. Wpiszę 26 to wyświetla powiększanie bufora, ale też 2 razy wyświetla "Podaj kolejny wyraz lub zakoncz ENTER-em" i też jak wpiszę bardzo dużo znaków to mi wywala błąd.

0

Wychodzi na to, że jesli podam więcej niż posiada bufor to tak jakby zapisuje te 10 znaków ,ale nie idzie do początku żeby znowu wprowadzić znaki tylko robi jeszcze obrót i te znaki po 25 zapisuje w nowej linijce i dopiero przechodzi do podawania nowych znaków. Wie ktoś jak temu zapobiec ?

0

powiększenie zmiennej size nie zwiększy bufora, musisz zrobić realokację! No i to brzydkie goto - fuj!

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