Hoşgeldin Misafir

C dilinde dosya yönlendirmeleri (IO redirection)

Stronger_Cracker

25 Tem 2022
6,399 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Merhabalar, Tekrar burada olmak çok güzel. :)

Bugün C dilinde stdin ve stdout işaretlerini “> ve <” kullanmadan dosya yönlendirmelerinin nasıl yapılabildiğinden bahsedeceğiz.

Bir programı Unix Linux veya Windows sistemlerinde çalışırken stdout dosyasını bir dosyaya yönlendirebilirsiniz. Bu şekilde dosya çıktıları bir dosyaya yazılabilir.

Linux sistemlerde aşağıdaki şekilde herhangi bir dosyaya stdout yönlendirmesi yapılabilir.

# ./dosya > cikti.txt

Bu şekilde çalıştırılan dosyaya ait çıktı bilgisi cikti.txt dosyasına yazdırılacaktır.

Tıpkı bu yöntemde olduğu gibi, < küçüktür işaretini kullanarak stdin’i çalıştırılan programa girdi sağlaması için kullanabilirsiniz. Ayrıca aşağıdaki yönlendirme şekilleri özellikle karşınıza çıkmıştır.

# find / -name *.txt 2>/dev/null

Bu tarz yönlendirmelerde başına 2 getirilen büyüktür işareti stderr’yi temsil etmektedir ve find komutunun çalıştırılması esnasında oluşabilecek herhangi bir hatayı göstermeyip /dev/null’ın içerisine yazmasını söylenmektedir. Aslında baktığınızda /dev/null diye bir dosya bulunmamaktadır, yani bu tür bir kullanımda stderr çıktıları hiçbir dosyaya yazdırılmamaktadır. /dev/null dosyasını altı delik bir sepet olarak düşünebiliriz. İçine koyduğunuz her şeyin aşağı düştüğü ve hiçbir şeyin barındırılmadığı bir sepet olarak tahayyül edebiliriz.

Bugün bu yönlendirme işlemini C fonksiyonlarını kullanarak yapacağız. C dilindeki standart fonksiyonları kullanarak programınızın çıktısını farklı bir dosyaya yönlendirebilirsiniz. Bu işlem için freopen fonksiyonu kullanılmaktadır. Fonksiyona ait prototip’e bakarsak,

https://linux.die.net/man/3/freopen

FILE *freopen(const char *path, const char *mode, FILE *stream);

Fonksiyonun birinci parametresi üzerine yazılacak dosyanın yol ifadesidir. İkinci parametresi hangi mode ile işlem yapılacağını, üçüncü parametre ise hangi dosyayı yönlendireceğimiz ifadesini alıyor.

Üçüncü parametreye stdin, stdout veya stderr yazılabilir ve bu şekilde oraya yönlendirme yapılabilir.

Stdout üzerine yapılabilecek yönlendirmelere örnek olması açısından aşağıdaki kodu yorumayabiliriz.

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

int main() {

FILE *f;
int i;

if ((f = freopen("test.txt", "w+", stdout)) == NULL) {

fprintf(stderr, "acilamadi\n");
exit(EXIT_FAILURE);

}
for (i = 0;i < 10; ++i) {
printf("%d\n", i);
}

fclose(f);
return 0;
}

Freopen fonksiyonuna geçmeden önce hemen altındaki for döngüsüne bir bakalım. For döngüsü 0 dan 9’a kadar olan sayıları ekrana yani standart output’a yazdırmaktadır (stdout). Biz freopen fonksiyonunu kullanarak standart output’a yazdırılacak bu çıktığı test.txt dosyasına yönlendirmekteyiz. Freopen fonksiyonunun üçüncü parametresine geçilen stdout ile bu imkânı yakalamış olduk. Kodu derleyip çalıştırdığımızda proje dizini altında test.txt dosyası oluşacaktır ve dosya içeriği aşağıdaki görseldeki gibi olacaktır.

ekd4duz.png


Freopen fonksiyonuna ait parametre bilgilerinde hangi mod ile işlem yapılacağını belirtmek için w, w+, r.. gibi mod bilgileri girmekteyiz. Son olarak bu modlara göz atalım.

Sıra

Mod & Açıklama

1

“r”
Okumak için bir dosyayı açar, bunu yapabilmesi için bir dosyanın daha önceden oluşturulmuş olması gerekir.

2

”w”
Yazmak için boş bir dosya oluşturur. Eğer aynı isime sahip herhangi bir dosya varsa içeriğini siler ve dosya boş olarak kabul edilir.

3

”a”
Bir veriyi dosyanın sonuna ekler ve eğer dosya yoksa oluşturur.

4

”r+”
Hem okumak hem de güncellemek için bir dosya açar. Bunu yapabilmesi için daha önceden dosyanın oluşturulmuş olması gerekir.

5

”w+”
Hem okuma hem de yazma için boş dosya oluşturur.

6

”a+”
Okuma ve ekleme için bir dosya açar.