2016-04-07 11 views
0

C++' da yapmam gereken bir işim var ve bir dosya .txt dosyasını okuyacağımı ve içerideki bilgileri kullandığını varsayalım. Fakat öğretmenimiz bize yardım için kodun başlangıcını verdi ve gerçekten anlamadım. Ben C++ 'da çok yeni başladım, bu yüzden saatlerce aradım ama cevabı bulamadım, teşekkür ederim!Bu kod parçasını anlamıyor musunuz? C++ 'da bir dosya okumakla ilgili.

int main(int argc, const char** argv) 
{ 
    std::ifstream* myfile = NULL; 

    if (argc == 2) { 
     file = myfile = new std::ifstream(argv[1]); 
     if (myfile->fail()) 
      std::cerr << "Error at the opening of the file'" << argv[1] << "'" << std::endl; 
    } 
    else 
     std::cerr << "No file name." << std::endl; 

    while (*file) { 
     std::string event; 
     *file >> event; 
     if (!(*file)) break; 

     if (event == "recipe") { 
      std::string namerecipe; 
      *file >> recipe; 

...

Soo ben alamadım:

İşte kod parçası? * Dosya nedir? ve dosya? Dosyada bir işaretçi mi? Neden hat üzerinde herhangi bir işlev çalışmıyor? "While * file" neden yapılmalı? Çok teşekkür ederim!

+0

pointer'ların ne olduğunu biliyor musunuz? – immibis

+0

Bu kodun kasıtlı olarak delice olduğundan şüpheleniyorum. – user4581301

+1

Bekleyin. Öğretmeniniz 'std :: ifstream' dinamik olarak ayırır? Ya bir şeyleri özledim ya da özel bir öğretme amacı var, ya da öğretmen programlamada iyi değil. –

cevap

1
int main(int argc, const char** argv) 
{ 

Tipik fonksiyonu giriş noktası test etmek streamin boolean operatörü kullanıyor.

std::ifstream* myfile = NULL; 

    if (argc == 2) { 

argv[1] bir dosya adı almak için yeterli argümanlar olmadığından emin olun.

 file = myfile = new std::ifstream(argv[1]); 

Dinamik bir dosya giriş akışı ayırır ve argv[1] belirtilen dosyayı açmak için kullanmaya çalışır. Bu dosya akışı daha sonra iki göstericiye, file ve myfile'a atanır. İki işaretçiye sahip olmanın noktasını görmediğimi itiraf ediyorum, ama aynı zamanda bir işaretçinin ilk noktasını görmüyorum.

 if (myfile->fail()) 

Akışın fail işlevini çağırır. Bu, akışta bir sorun varsa test eder. Bu noktada, tüm sınama, akışın açılıp açılmadığıdır.

  std::cerr << "Error at the opening of the file'" << argv[1] << "'" << std::endl; 
    } 
    else 
     std::cerr << "No file name." << std::endl; 

    while (*file) { 

dosya nesne üzerinde faaliyet için file işaretçi dereferences. Bu, akışın boole operatörünü arama etkisine sahip olacaktır. Bu, aynı durumda (C++ 11 veya daha yeni) veya bu durumda (C++ 11'den önceki önceki) etkisinin !file->fail() numaralı çağrısıyla çok benzer. dereden http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

 std::string event; 
     *file >> event; 

Oku tek boşluk ayrılmış simgesi, tek kelimeyle,: operatör burada bool Daha.

 if (!(*file)) break; 

Operatör bool'u tekrar. Başarısızlıktan döngüden çıkın. Akıştan başka bir sözcük daha okuyun.

kod, bu doğrultuda yeniden yazılabilir:

int main(int argc, const char** argv) 
{ 
    if (argc == 2) 
    { 
     std::ifstream myfile(argv[1]); 
     if (myfile) 
     { 
      std::string event; 
      while (myfile >> event) 
      { 
       //this function is getting deep. Consider spinning this off into a new function 
       if (event == "recipe") 
       { 
        std::string namerecipe; 
        if (myfile >> recipe) 
        { 
         // do stuff that is missing from code sample 
        } 
        else 
        { 
         // handle error 
        } 
       } 
      } 
     } 
     else 
     { 
      std::cerr << "Error at the opening of the file'" << argv[1] << "'" << std::endl; 
     } 
    } 
    else 
    { 
     std::cerr << "No file name." << std::endl; 
    } 
} 
+0

Teşekkür ederim, bana yardım ettiğiniz için gerçekten minnettarım! Sanırım şimdi anladım, açıklamaların çok açık. – robbie

0
  1. *file bir giriş dosyası Akış ifstream nesne işaret ediyor sizin göstericidir.
  2. file, Dosya Dosya akışınızı ifstream nesnesidir.

  3. while(*file)

    (hatasız dosya okunurken) Girdi Dosya Stream bir hata koşulu için

+0

Point 3 yanlış. NULL için test değil, akıştaki bir hata durumunu test etmek için akışın boolean operatörünü kullanıyor. – user4581301

+0

@ user4581301 Bağlı bir listeyi nasıl yinelediğimize benzediğini düşündüm. Ehm, düzenleyeceğim ders için teşekkürler. Daha fazla netleştirebilir misin? –

+1

, while (! File-> fail()) 'için kısa yoldur. Daha fazla bilgi için: http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool (Düzeltmeliyim. C++ 11'de kısa yoldur. Önceden sadece benzerdi) – user4581301

İlgili konular