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.