>> KONUŞMACI: Şimdiye kadar, büyük olasılıkla programlarınızın çoğu bu
Biraz geçici olmuştur.
Siz Mario veya Açgözlü gibi bir programı çalıştırmak.
Bu belki sorar, bir şey yok Bazı bilgiler için kullanım,
ekrana bazı çıktı yazdırmak ama sonra program bitince
Orada hiçbir kanıt orada gerçekten hiç ilk etapta çalıştırıldı.
Eminim, sol olabilir, yani o, terminal penceresinde açmak
Eğer ekranı temizlemek ama eğer var o var gerçekten hiçbir kanıt.
Biz depolamak için bir araç yok Kalıcı bilgiler, bilgi
Bu kızımız sonra var Program çalışırken durdu,
ya da biz bu noktaya kadar değil.
Neyse rağmen, c yapar yeteneği ile bize
uygulayarak bunu bir şey denir
Bir dosya, bir yapı temelde Eğer iki katına çıkacak bir dosyayı temsil
sen eğer bilgisayarınızda tıklayın Bir grafik kullanıcı ortamına kullanılır.
Genel olarak çalışırken c, biz aslında konum
ile çalışıyor olacak işaretçileri dosyasını files-- için stars--
biraz dışında Biz bir çift hakkında konuşmak
fonksiyonlarının olduğunu Dosya işaretçileri ile çalışır.
Gerçekten kazdık gerekmez anlayış işaretçiler içine çok derin
kendileri.
Biraz ufacık biraz var Biz onlar hakkında konuşmak nerede,
ancak genellikle işaretçileri dosya ve göstericiler, birbiriyle iken,
tam olarak aynı şey değildir.
>> Şimdi ne zaman ne demek istiyorsun Ben kalıcı veri demek?
Kalıcı veri nedir?
Bu konuda neden önemsiyorsun?
Bu, örneğin, ki Bir program çalıştırıyorsanız
veya yeniden yazılamaz olduğunuz bir bir oyun programı,
ve takip etmek istediğiniz Kullanıcının hamle tüm
böylece bir şey yanlış giderse belki eğer, Maçtan sonra dosyayı inceleyebilirsiniz.
Yani ne zaman biz demek ne kalıcı veri hakkında konuşun.
>> Çalışan derste senin Program, bir dosya oluşturulur.
Ve ne zaman bir program çalışan durdu,
Bu dosya hala sistemde bulunan.
Ve biz ona bakmak ve onu inceleyebilirsiniz.
Ve böylece programı ayarlanmış olması Bazı kalıcı veri oluşturduk,
Veri programı sonrası mevcut çalışması tamamlanmıştır.
>> Şimdi işe bu fonksiyonların hepsi dosyaları oluşturma ve idare ile
çeşitli şekillerde bunları Standart io.h yaşamak,
hangi bir başlık dosyası olduğunu büyük olasılıkla kiloluk oldum
güzel üstündeki dahil programların hemen bütün
o biri içerdiğinden Bizim için en kullanışlı fonksiyonlar,
Ayrıca sağlayan printf, Standart io.h yaşıyor
Yani dahil sterlin gerekmez herhangi bir ek dosya muhtemelen
sırayla dosya işaretçisi ile çalışmak.
>> Şimdi her dosya gösterici işlevi, ya her bir dosya G / Ç, giriş çıkış
fonksiyonu, biri olarak kabul onun parametreleri veya girişlerin
dışındaki dosya pointer-- biri için, Fopen, burada
Dosyayı almak için kullandığınız ne ilk etapta işaretçi.
Ama açtın sonra dosya ve dosya işaretçisi almak,
Eğer bunları iletebilirsiniz çeşitli işlevlere argümanlar
Biz hakkında konuşmak için gidiyoruz Bugün, hem de birçok
böylece dosyaları ile çalışabilirsiniz.
>> Yani altı oldukça vardır ortak temel olanları
bugün hakkında konuşmak için gidiyoruz.
fopen ve onun arkadaşı Fonksiyon fclose, fgetc
ve onun arkadaşı fonksiyonu fputc, ve fread ve onun arkadaşı fonksiyonu,
fwrite.
Yani sağ içine alır.
>> fopen-- ne işe yarar?
Evet, bu bir dosyayı açar ve Bunun size bir dosya işaretçisi verir,
böylece o kullanabileceğiniz argüman olarak işaretçisi dosya
diğer dosya I / O fonksiyonları herhangi.
En önemli şey fopen ile hatırlamak
Açtığınız olduğunu sonra dosya ya da burada gibi bir çağrı yaptı,
emin olmak için kontrol etmeniz gerekir Bu size geri aldım işaretçi
null eşit değildir.
Videoyu izledim değilseniz işaretçileri, bu mantıklı olmayabilir.
Ama denemek ve eğer inceleyebilirsiniz bir boş gösterici hatırlama,
program muhtemelen yaşayacaktır Bir segmentasyon [duyulamaz].
Biz emin olmak istiyorum biz meşru bir işaretçi geri aldım.
Zamanın büyük çoğunluğu biz olacak Geri meşru işaretçi aldık
ve bu bir sorun olmayacak.
>> Peki nasıl bir çağrı fopen yapabilirim?
Bunun gibi hemen hemen görünüyor.
Jenerik olmak ptr ptr-- Dosya yıldızı pointer-- Fopen dosya adını
ve biz iki şeyi bir dosya adı geçmesi ve bir işlem biz üstlenmek istiyoruz.
Yani biz benzeyen bir çağrı olabilir bu-- dosya yıldız ptr 1 fopen eşittir
file1.txt.
Ve ben seçtiğim operasyon r.
>> Peki ne r burada olduğunu düşünüyorsunuz?
Şeyler çeşitleri nelerdir biz dosyaları yapmak mümkün olabilir?
Yani r operasyon olduğunu biz Biz bir dosyayı okumak istediğinizde seçin.
Yani temelde ne zaman olur Böyle bir çağrı yapmak
kendimize bir dosya işaretçisi getting biz sonra bilgiyi okuyabilir böyle
file1.txt dan.
>> Benzer şekilde, dosya 2.txt açabilir ptr2 yazma ve böylece biz geçebilir,
Burada oluşturduğunuz dosya gösterici, Herhangi bir işleve argüman olarak o
bir dosyaya bilgileri yazar.
Ve yazmaya benzer, orada Ayrıca seçeneği, eklenecek.
Aradaki fark yazma ve ekleme
olmak, bir dosyaya yazarken o, yazılı için fopen çağrısı yaparsanız
ve bu dosya zaten bu, mevcut tüm dosya üzerine gidiyor.
Başlamak için gidiyor başında,
tüm bilgileri silerek zaten var.
>> Eğer ekleme için açarsanız Oysa, bu dosyanın sonuna gidecek
Zaten metin varsa o ya da bilgi,
ve bundan sonra başlayacak Oradan yazma.
Yani herhangi kaybetmezsiniz Daha önce yaptığım bilgiler.
Yazmak ya da eklemek istiyorum olsun çeşit duruma bağlıdır.
Ama muhtemelen ne bileceksiniz zamanı geldiğinde doğru bir işlemdir.
Yani fopen var.
>> Ne fclose dersiniz?
Eh, oldukça basit, fclose Sadece dosya işaretçisi kabul eder.
Ve Tahmin edebileceğiniz gibi, o dosyayı kapatır.
Biz dosyayı kapattıktan sonra, biz yapamam herhangi bir dosya daha I / O fonksiyonları gerçekleştirmek
okuma ya da dosya üzerinde, yazma.
Biz yeniden açmak zorunda için başka bir zaman dosya
ile çalışmaya devam etmek I / O fonksiyonları kullanarak.
Biz bitti So fclose araçlar Bu dosyayla çalışıyor.
Ve biz geçmek için ihtiyaç vardır Bir dosya işaretçisi adı.
Önce bir çift kayar üzerinde Yani biz okumak için fopened dosya 1 nokta metni
ve biz atanmış ptr1 işaretçiyi dosya.
Şimdi biz olduğuna karar verdim Bu dosyadan okuma yapılır.
Biz onunla bir daha yapmak gerekmez.
Biz sadece fclose ptr1 yapabilirsiniz.
Ve aynı şekilde, biz-ebil diğerlerini fclose.
Pekala.
Böylece açılış ve kapanış ediyor.
Bu iki temel işlemleri başlıyor.
>> Şimdi biz aslında istiyoruz bazı ilginç şeyler,
ve ilk fonksiyon o yaparız Bu fgetc-- olduğunu yapacağız bakın
Bir karakteri olsun dosya.
Bu genellikle fgetc ne çevirmek istiyorum.
Hayatta Onun hedefi olduğunu Bir sonraki karakteri okumak,
ya bu senin çok ise fgetc ilk çağrı
Belirli bir dosya için, İlk karakter.
Ama ondan sonra, Eğer, bir sonraki almak
o dosyanın bir sonraki karakteri, Bir karakter değişkeni ve depolar.
Burada yaptığım gibi, karakter ch, fgetc eşittir
Bir dosya işaretçisi adına geçmektedir.
Yine, çok var: Hatırlanması gereken Burada önemli
sipariş var olduğunu Bu işlem başarılı,
Dosya işaretçisi kendisi olmalı okumak için açılmış.
Bir dosyadan bir karakter okuyamaz Biz yazmak için açılmış işaretçi.
Yani biri fopen sınırlamaları, değil mi?
Biz kısıtlamak zorunda kendimizi sadece performans için
Bir dosya işaretçisi ile bir işlem.
Biz okumak isteseydim ve Aynı dosyadan yazma,
açık iki ayrı olurdu Aynı file-- dosya işaretçileri
okuma için bir yazılı için.
>> Yani yine tek nedeni Ben şimdi bu konuyu
Biz bir çağrı yapmak için gidiyoruz çünkü eğer fgetc için, bu dosya işaretçisi olmalı
okumak için açılmış.
Ve sonra oldukça basit, tüm yapmamız gereken
Dosya işaretçisi adına geçmektir.
Yani Char ch fgetc ptr1 eşittir.
>> Bu bizi almak için gidiyor Bir sonraki character--
veya yine bu ilk ise Bu aramayı yaptık zaman,
ilk character-- ne olursa olsun Dosya ptr1 tarafından işaret edilmektedir.
Bu dosya 1 nokta metni olduğunu hatırlayın.
O ilk karakterini alırsınız ve biz değişken ch saklayın olacak.
Oldukça basit.
Yani biz sadece üç baktım fonksiyonları ve biz zaten
Oldukça düzgün bir şey yapabilirsiniz.
>> Bu yeteneği almak Yani eğer Bir karakteri alma
ve biz döngü böylece dökersin-- biz karakterleri almaya devam
Bir dosyadan üzerinde ve üzerinde ve çakışık şimdi
her okuyabilirsiniz Bir dosyanın karakter.
Ve biz her karakter yazdırarak Biz okumak hemen sonra,
Şimdi bir dosyadan okudum ve ekrana içeriğini basılmış.
Biz etkin bir şekilde birleştirilir ettik Ekranda bu dosya.
Ve bu ne Linux komut kedi yok.
>> Dosya adında kedi yazarsanız, onu tüm içeriğini yazdırmak olacak
Terminal penceresinde dosyanın.
Ve işte bu küçük döngü, kod sadece üç satır,
ama etkin bir şekilde çoğaltır Linux komut kedi.
Yani bu sözdizimi olabilir biraz garip görünüyorsun
ama burada Buradaki buydu.
Ch fgetc eşittir birlikte, ptr değildir bir bütün lokma EOF-- eşit
ama o da sadece kırmasına izin bu yüzden sözdizimi açıktır.
Bunu konsolide ettik alan uğruna,
Biraz olsa sözdizimsel zor.
>> Yani yeşil sağ bu bölümü şimdi, ne yapıyor?
Peki, bu sadece bizim fgetc çağrısı, değil mi?
Biz daha önce gördüm.
O birini elde ediyor Dosyadan bir karakter.
Sonra biz karşılaştırmak EOF karşı karakter.
EOF var özel bir değerdir Standart io.h, tanımlı hangi
Dosya karakteri sonudur.
Yani temelde ne olacak neler Bu döngü bir karakter okuyacak olan,
, dosya sonuna kadar karşılaştırın Dosya karakterinin sonu.
Onlar uyuşmuyorsa, bu yüzden biz değil Dosyanın sonuna ulaştınız
Biz o karakteri basalım.
Sonra geri gidersiniz Yine döngünün başında.
Bir karakteri alırsınız, çek EOF karşı, böylece çıktısını ve
ve benzerleri ve bu yüzden, bu şekilde döngü
Biz dosyanın sonuna ulaşana kadar.
Ve sonra o noktaya göre, baskılı olacak
dosyanın tüm içeriğini dışında.
Yani yine, biz sadece gördüm fopen, fclose ve fgetc
ve zaten biz çoğaltabilirsiniz Bir Linux terminal komutu.
>> Başında Dediğim gibi, Biz fgetc ve fputc vardı
ve fputc arkadaşı oldu fgetc işlevi.
Ve böylece, gibi, hayal olabilir bu yazı eşdeğerdir.
Bu bize yazmak için izin bir dosyaya tek bir karakter.
>> Yine, ihtar olmak, sadece o fgetc oldu gibi dosya
Biz olmalı için yazıyoruz o olmuştur yazma veya ekleme için açıldı.
Biz denemek ve bir dosya üzerinde fputc kullanıyorsanız Biz okumak için açtın ki
Biz acı gidiyoruz Bir hata biraz.
Ama çağrı oldukça basittir.
fputc sermayesi A ptr2 tüm Bunu gidiyor bu kadar olduğunu
Mektup yazmak olacak Bir dosya içine 2 nokta haline
adıydı metin, Biz açtı ve atanmış olduğunu dosya
işaretçi ptr2 için.
Yani biz bir yazmak için gidiyoruz Sermaye A 2 nokta metni dosya.
Ve biz bir ünlem yazacağım 3 nokta dosyaya gelin
ptr3 tarafından işaret edilen metin.
Yani yine, burada oldukça basit.
>> Ama şimdi başka bir şey yapabilirim.
Bu örnek var biz sadece gittiğini
kedi çoğaltmak mümkün olmakla ilgili Linux komut, yazdırır biri
ekrana.
Eh, şimdi biz bir yeteneğe sahip olduğunu dosyalarından karakterleri okumak için
ve, dosyalara karakterleri yazma neden sadece yerine geçmez
fputc çağrısı ile printf arayın.
>> Ve şimdi biz cp çoğaltılamaz ettik, Bir çok temel Linux komut
Biz yol uzun konuştuk o önce Linux videoyu komutları.
Biz etkin bir şekilde var Burada o çoğaltılamaz.
Biz bir karakteri okuyorsanız ve sonra konum Başka bir dosyaya bu karakteri yazarken.
Bir dosyadan okuma, yazma ve üzerinde başka, için
Tekrar tekrar biz EOF girene kadar.
Biz sonuna kadar var dosya biz kopyalamak için çalışıyoruz.
Ve biz tüm yazılı olacak karakter Biz dosyaya ihtiyacımız
biz yazıyoruz.
Yani bu cp, Linux kopyalama komutu olduğunu.
>> Başında Bu video ben ihtar vardı
Biz konuşmak olacağını işaretçileri hakkında biraz.
Biz nereli İşte spesifik olarak işaretçileri hakkında konuşacağım
ek işaretçileri dosya.
Yani bu fonksiyon korkutucu görünüyor.
Birkaç parametre var.
Burada devam eden bir sürü var.
Farklı bir yeri var renkler ve metinler.
Ama gerçekten, bu sadece fgetc jenerik versiyonu
Bu bize herhangi almayı sağlar bilgi miktarı.
Biz eğer biraz verimsiz olabilir Bir seferde karakterler getting,
dosyanın yineleme Bir seferde bir karakter.
Bunu elde etmek güzel olmaz mıydı Her seferinde bir zaman ya da 500 ° C'de 100?
>> Eh, fread ve onun arkadaşı fonksiyonu fwrite, biz hangi hakkında konuşacağım
İkinci olarak, bize sadece bunu sağlar.
Biz keyfi bir miktar okuyabilirsiniz Bir dosyadan bilgi
ve biz bir yere geçici olarak saklayın.
Yerine sadece edememek Tek bir değişkene sığacak,
Biz bir dizide depolamak gerekebilir.
Ve böylece, biz dört geçmek argümanlar bir işaretçi fread-- için
Biz konum konuma bilgileri saklamak için gidiyoruz,
nasıl bilgi her birim büyük olacak, bilgi kaç adet
Biz kazanmak istiyoruz ve gelen hangi dosya biz onları almak istiyorum.
Muhtemelen en iyi resimli Burada bir örnekle.
Yani biz ilan diyelim 10 tamsayılar dizisi.
Biz sadece ilan ettik keyfi yığını arr 10 int.
Yani oldukça basittir.
Şimdi ne olsa yapıyoruz olduğunu frecall biz int boyutu okuyorsanız olduğunu
Zaman bilgilerin 10 bayt.
Int varlığın büyüklüğü işte dört-- c bir tamsayı boyutu.
>> Peki ne yapıyoruz biz okuyorsanız olduğunu Bilgi değerinde 40 bayt
Dosyadan ptr tarafından işaret etti.
Ve biz o saklıyoruz 40 bayt yerde
Biz kenara nerede Bellek değerinde 40 bayt.
Neyse ki, biz zaten tarafından yaptık Bu dizi tam orada, arr ilan.
Bu holdingin yeteneğine sahiptir 10 dört bayt birimleri.
Toplam Yani, bu 40 tutabilir bayt bilgi değerinde.
Ve şimdi 40 bayt okuma dosyadan bilgi,
ve biz arr saklayarak ediyoruz.
>> Işaretçileri video hatırlayın Böyle arr gibi bir dizi adı,
Gerçekten sadece bir işaretçi ilk elemana.
Yani biz orada arr geçerken, biz bir işaretçi geçen, aslında, bulunmaktadır.
>> Aynı şekilde biz bu-- yapabiliriz biz mutlaka yok
yığınında bizim tampon kaydetmeniz gerekir.
Biz de dinamik tahsis olabilir Bir malloc kullanarak, böyle tampon.
Ne zaman, unutmayın dinamik bellek ayrılamadı,
biz kaydetmeden ediyoruz Yığın, değil yığın.
Ama yine de bir tampon bulunuyor.
>> Yine de, bu durumda, bir bilgi 640 bayt tutan
Çift sekiz bayt kadar sürer, çünkü.
Ve biz bunların 80 için soruyorsun.
Biz alana sahip istiyoruz 80 çift tutun.
Yani 80 kere 8 640 byte bilgidir.
Ve fread o çağrı bilgi 640 bayt toplanması
dosyasıyla işaret den ptr ve arr2 şimdi saklayarak.
>> Şimdi de fread tedavi edebilir Sadece fgetc bir çağrı gibi.
Bu durumda, sadece çalışıyoruz Dosyadan bir karakter olsun.
Ve biz bir ihtiyacımız yok Dizi bir karakter tutun.
Biz sadece saklayabileceğiniz Bir karakter değişkeni.
>> Catch olsa, yani biz sadece bir değişken varsa,
Biz geçmesi gerekiyor Bu değişkenin adresi
hatırlama çünkü fread ilk argüman
konumu ve bellek için bir gösterici Biz bilgiyi depolamak istediğiniz.
Yine, bir ismi Dizi göstericisidir.
Yani biz işareti dizi yapmak gerekmez.
Ama c c karakteri Burada, bir dizi değil.
Bu sadece bir değişken.
Ve böylece biz geçmesi gerekiyor işareti c belirtmek için
biz istiyoruz adres olduğunu Bu bilgi bir bayt saklamak,
Bu bir karakter olduğunu Biz ptr gelen topluyorsunuz.
Ben üzerinden gidersiniz Fwrite-- Bu biraz daha
quickly-- oldukça fazla fread tam eşdeğeri
yazılı içindir hariç yerine okuma, sadece
other-- gibi açık yaşadım ve yakın bir karakter olsun,
Bir karakteri yazın.
Şimdi keyfi almak var bilgi miktarı,
bilgi doğru keyfi miktarda.
Yani daha önce olduğu gibi, biz 10 tamsayılar bir dizi var
nerede zaten bilgi, belki saklandı.
>> Muhtemelen kod bazı satırları oldu bu iki arasında gitmeli
ben arr doldurmak nerede Anlamlı bir şey.
Ben 10 farklı tamsayılar ile doldurun.
Ve bunun yerine, ne olduğumu yapıyor arr gelen yazıyor
ve arr bilgi toplama.
Ve ben bu bilgiyi alıyorum ve dosya içine koyarak.
>> Bunun yerine ondan olma tampon dosya,
Biz şimdi gidiyoruz dosyasına tamponu.
Yani tam tersi var.
Sadece eskisi gibi Yani yine, biz Ayrıca bellek yığın yığın var
Biz dinamik ettik o tahsis ve okumak
ve dosyaya yazarlar.
>> Ve biz de tek bir değişkene sahip bir bayt tutabilen
Böyle bir karakter olarak bilgilerin.
Fakat yine de, biz geçmesi gerekiyor Bu değişkenin adresi
biz ondan okumak istediğinizde.
Yani biz bilgiyi yazabilirsiniz Biz o adreste bulabilirsiniz
Dosya işaretçisi, ptr.
>> Başka bir sürü var Büyük bir dosya I / O fonksiyonları
bunun yanı sıra çeşitli şeyler yapmak olanlar bugün konuştuk.
Olanlar bir çift işinize yarayabilecek
fgets ve fputs olan, bu eşdeğerdir
fgetc ve fputc göre değil de okuma Bir dosyadan tek bir dize.
Bunun yerine tek bir karakteri, bir bütün dize okuyacaktır.
temelde veriyor fprintf, Eğer dosya yazmak için printf kullanmak için.
Yapabileceğiniz Yani tıpkı kullanarak değişken değiştirme
tutucuları yüzde i ve printf ile yüzde d, ve bu yüzden,
Eğer benzer alabilir printf dize ve baskı şey
bir dosyaya böyle.
>> fseek-- DVD oynatıcı varsa Ben genellikle burada-- kullanmak benzetme
çeşit kullanmak gibidir senin geri sarma ve hızlı ileri
düğmeleri film dolaşmak için.
Benzer şekilde, dosyanın etrafında hareket edebilirsiniz.
Içeride şeylerden biri bu dosya yapısı
Eğer bir göstergesi o c yaratır nerede sen dosyasında var.
Çok altında mısınız bayt sıfır, başlangıç?
Eğer bayt 100 Are, Bayt 1000, ve böylece?
Sen keyfi hareket etmek fseek kullanabilirsiniz ileri ya da geri o gösterge.
>> Ve yine, ftell DVD oynatıcı benzeri,
söyler küçük bir saat gibi Kaç dakika ve saniye sizi
Belirli bir filme vardır.
Benzer şekilde, ftell nasıl söyler Birçok bayt dosyaya içine.
feof farklı versiyonu size ettik olmadığını tespit
dosyanın sonuna ulaştı.
Ve fError bir fonksiyonudur Eğer kullanabilirsiniz
bir şey olup olmadığını tespit etmek için Bir dosya ile yanlış çalışma gitmiş.
Yine, bu sadece bir yüzeyi çizilmeye.
Bol daha fazla dosya I / O hâlâ var Standart io.h işlevleri
Ancak bu muhtemelen size alacaksınız Dosya işaretçileri ile çalışmaya başladı.
Ben Doug Lloyd değilim.
Bu CS50 olduğunu.