C programlama ödevlerinde genellikle girdi verileri txt dosyasından okutularak verilir. Veriler satır satır verilir ve genellikle satırlarda da boşluklar ile ayrılmış farklı verilerin de okunup parse edilmesi beklenir. Bu yazımızda bu şekilde tanımladığımız bir input.txt dosyasını C programlama dili ile okuyup, satırlardaki aralarında boşluk karakteri olan verileri ayırıp (split) tek tek parse edeceğiz ve integer değişkene atayacağız.
Aşağıdaki gibi bir input.txt dosyası verilmiş olsun. Satırlarda şehir isimleri ve koronavirüs vaka sayıları aralarında boşluk olacak şekilde verilmiştir. Bu dosyayı satır satır okuyup vaka sayısı değerlerini de integer değere çevireceğiz.
Adana 1300 1450 1750 2000 Ankara 3500 3680 4890 5000 İstanbul 5000 5890 6850 7500
Çözüm kodu aşağıdaki gibi olacaktır.
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { FILE *dosya = fopen("input.txt", "r"); int maxTahminiSatirUzunlugu = 255; char satir[maxTahminiSatirUzunlugu]; while(fgets(satir, maxTahminiSatirUzunlugu, dosya)) { printf("satir: %s\n", satir); char * parca; parca = strtok (satir," "); int parcaIndex = 0; while (parca != NULL) { parcaIndex++; if(parcaIndex > 1){ int vakaSayisi = atoi(parca); printf("parca: %s integer degeri %d\n", parca, vakaSayisi); } else { printf("parca: %s\n", parca); } parca = strtok(NULL, " "); } } fclose(dosya); return 0; }
Parça parça kodu inceleyelim.
fopen metodu ile dosyamızı r (read) parametresi ile okuma modunda açıyoruz.
Okuyacağımız satırları tutacak bir buffer char arrayine ihtiyacımız var. Dinamik olarak üreteceğimiz gibi bizim yaptığımız gibi tahmini olarak bir maksimum uzunluk belirleyip bu uzunlukta sabit bir char array de tanımlayabiliriz.
fgets metodu ile dosyayı satır satır okuyoruz ve okuduğumuz satırı tanımladığımız satır değişkenine atıyoruz. Konsola satırı yazdırıyoruz.
strtok metodu ile verdiğimiz satır parametresini ikinci parametre olarak verdiğimiz ayraç (delimeter) parametresini kullanarak parçalara ayırıyoruz.
Şehir isimlerini integer değere çevirmeye çalışmayalım diye parcaIndex değerini tutuyor ve ilk parçayı atlıyoruz.
String veya char array formunda bulunan sayısal değeri gerçek int değere çevirmek için atoi metodunu kullanıyoruz.
parca değişkeni NULL gelene kadar strtok çağırmaya devam ediyoruz ve satırı bu şekilde parçalarına ayırmış oluyoruz.
En son olarak programdan çıkmadan dosya pointer'ını kapatıyoruz.
gcc ile programı derleyip çalıştırdığımızda çıktısı aşağıdaki gibi olacaktır.
>
satir: Adana 1300 1450 1750 2000
parca: Adana
parca: 1300 integer degeri 1300
parca: 1450 integer degeri 1450
parca: 1750 integer degeri 1750
parca: 2000
integer degeri 2000
satir: Ankara 3500 3680 4890 5000
parca: Ankara
parca: 3500 integer degeri 3500
parca: 3680 integer degeri 3680
parca: 4890 integer degeri 4890
parca: 5000
integer degeri 5000
satir: İstanbul 5000 5890 6850 7500
parca: İstanbul
parca: 5000 integer degeri 5000
parca: 5890 integer degeri 5890
parca: 6850 integer degeri 6850
parca: 7500 integer degeri 7500
Bu da ilginizi çekebilir:
0 Yorumlar