Cuma, Ekim 26, 2007

C'de Dosya İşlemleri

C'de dosya okuma çok hata yapılan bir konu. Yakın zamanda bir kaç kişiye bu konuda yardım ettikten sonra bişeyler yazayım dedim.
İlk olarak bir dosyayı karakter karakter olarak okumak için kullanılan fgetc() 'nin kullanımına bakalım.
int fgetc( FILE * );
Burada dikkat edilmesi gereken fgetc 'nin int deger döndürmesi. Okunan karakterin degeri veya EOF dönebilir. Sık yapılan bir hata fgetc 'nin dönüş değerini char değişkene atanması sonucu ortaya çıkıyor. Örnek olarak verilen bir dosyayı karakter karakter okuyup ekrana basan ve satırları sayan koda bakalım.
int DosyayıEkranaYaz( FILE * fp )
{
int ch;
int cnt = 1;

while( (ch = fgetc(fp)) != EOF)
{
putchar( ch );
if(ch == '\n')
cnt++;
}

return cnt;
}
fgetc 'nin kullanımı bu şekilde. Bir başka sorun da feof() fakat bence bu fonksiyonu kullanmaya gerek yok çünkü bütün fonksiyonlar dosya sonunu bir şekilde belirtiyorlar zaten. Örneğin fgets dosya sonunda NULL dönüyor. Dosyayı satır satır okumak istersek şöyle bir kod kullanabiliriz.
#include <stdio.h>
int main()
{
FILE * fp = fopen("deneme.txt", "r");
char satir[100];

while( fgets(satir, sizeof(satir), fp) != NULL )
fputs(satir, stdout);
fclose(fp);
return 0;
}
Metin dosyalarını okumak için genel olarak bu bilgiler yeterli. İkili dosya işlemleriyle ilgili de belki daha sonra yazarım.

2 yorum:

Adsız dedi ki...

birşey sorabilirmiyim ?
C de dosyadan okuma yapmam gerekiyor fakat istedigim satırdan okumaya başlamak ve istedigim aralıkları atlamayı nasıl yaparım

Hamdi Akoğuz dedi ki...

Bu uygulamanızın ve okumak istediğiniz dosyanın yapısına göre değişir. Belirli bir sayıda satır atlamak için döngü içinde fgets ile okuma yapıp sonucu yok sayabilirsiniz. Belirli kısımları atlamak için de fscanf kullanabilirsiniz. Ör: "Değer 1: 123, Değer 2: 2345" satırından sadece değerleri okumak için fscanf(fp, "Değer %d: %d, Değer %d, %d", id1, val1, id2, val2) gibi. Dosyanızın yapısı daha belirli ise ikili okuma yapmak için fread, fseek gibi fonksiyonlara bakabilirsiniz.