Linux ta Dosya okuma

Başlatan mr.engineer, 10 Mart 2021, 23:15:56

mr.engineer

Merhaba Linux'daki tail isimli son n satırı veya karakteri yazdıran komut satırı programını yazmaya çalıştım ama çalışmadı. Mesela son 4 satır için 4 elemanlı FILE* tipinde değişkenleri tutan bir pointer to pointer (FILE**) tanımladım. Circular buffer mantığına benzer şekilde her eleman dosyadan bir satır göstersin dedim. Buffer dolunca ilk eleman yeni okunan satırı (eğer böyle bir satır varsa) gösterecek şekilde değişiyor.

NOT: Aşağıdaki fonksiyon sadece son n satırı yazdırmak için.

int write_lines(FILE *f, int nlines)
{
	FILE **flines;
	char c;
	char line[MAX_LEN];
	int writeIndex = 0;
	
	if ((flines = (FILE**)malloc(sizeof(FILE*)*nlines)) == NULL)
	{
		fprintf(stderr, "cannot allocate buffer!..");
		fclose(f);
		exit(EXIT_FAILURE);
	}
	
	do
	{
		flines[writeIndex++] = f;
		if (writeIndex == nlines)
		{
			writeIndex = 0;
		}
		
	}while (fgets(line, MAX_LEN, f) != NULL);
	

	if (!feof(f))
	{
		fprintf(stderr, "cannot read file!..");
		free(flines);
		return 0;
	}
	
	while((c= fgetc(flines[writeIndex])) != EOF)
	{
		putchar(c);
	}
	
	if (ferror(f))
	{
		fprintf(stderr, "cannot read file!..\n");
		free(flines);
		return 0;
	}
	
	fclose(f);

	free(flines);
	return 1;
}


flines = (FILE**)malloc(sizeof(FILE*)*nlines)) == NULL

Böyle bir şeye daha önce denk gelmedim, buradan kaynaklı bir hata olabilir.

mehmet

Yapmak istediğiniz buna benzer bir şey?
"less"
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

mr.engineer

#2
Alıntı yapılan: mehmet - 11 Mart 2021, 13:50:19Yapmak istediğiniz buna benzer bir şey?
"less"

Hocam bu nedir anlamadım:)

Linux komut satırında çalıştırılan tail isimli bir komut var. Şu şekilde çalışıyor.

tail --lines 10 example.txt

Argüman olarak verilen text dosyasının son 10 satırını yazdırıyor. Ben de bunu yapıyorum. Yukarıda da bunu yapacak fonksiyonu paylaştım. Aşağıdaki işlemi biraz salladım gibi geldi sorun burada mı başka bir yerde mi onu danışmak istiyorum.

FILE **flines;

flines = (FILE**)malloc(sizeof(FILE*)*nlines));



Fonksiyon Linux'a özel değil Windowsda da yapılabilir fakat yine de belirtmek istedim.

mr.engineer


mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr