2016-04-07 5 views
0

У меня есть работа, которую нужно сделать на C++, и предполагается, что вы читаете файл .txt и используете информацию внутри. Но наш учитель дал нам начало кода, чтобы помочь, и я действительно не понимаю. Я очень новичок в C++, поэтому я искал его часами, но я не нашел ответа, спасибо!Не понимаю этот кусок кода? Это о чтении файла в C++

Вот кусок кода:

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 я не понимаю? Что такое * файл? и файл? Это указатель на файл? Почему на нем не работает какая-либо функция? Почему «while * file» должен делать? Большое спасибо!

+0

Вы знаете, что указатели? – immibis

+0

Я подозреваю, что этот код намеренно сумасшедший. – user4581301

+1

Подождите. Ваш учитель динамически выделяет 'std :: ifstream'? Либо я что-то пропустил, либо есть специальная цель обучения, либо учитель не умеет программировать. –

ответ

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

Типичной точки входа функции.

std::ifstream* myfile = NULL; 

    if (argc == 2) { 

Убедитесь, что есть достаточно аргументов, чтобы получить имя файла из argv[1].

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

Динамически распределяет входной поток файла и пытается использовать его, чтобы открыть файл, указанный в argv[1]. Этот поток файлов затем присваивается двум указателям, file и myfile. Я признаю, что не вижу смысла иметь два указателя, но я также не вижу точки указателя в первую очередь.

 if (myfile->fail()) 

Вызывает функцию потока fail. Это проверяет, есть ли что-то не так с потоком. В этот момент все, что нужно проверить, - это открыть или нет поток.

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

    while (*file) { 

разыменовывает file указатель для работы на объекте файла. Это вызовет вызов булевого оператора потока. Это либо одно и то же (C++ 11 или более недавнее), либо похожее на то, что не имеет значения в этом случае (до C++ 11) как вызов !file->fail(). Больше на оператора BOOL здесь: http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

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

Read один пробельных разделителями знак, одним словом, из потока.

 if (!(*file)) break; 

Оператор bool снова. Выйдите из цикла при ошибке.

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

Прочитать еще одно слово из потока.

Код может быть переписана по этим линиям:

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

Спасибо, я очень признателен, что помогаю мне! Я думаю, что у меня есть, ваши объяснения очень ясны – robbie

0
  1. *file ваш указатель, который указывает на входной файл потока ifstream объекта.
  2. file - это ваш входной файл Stream ifstream объект.

  3. while(*file) использует булев оператор потока, чтобы проверить состояние ошибки в потоке ввод файла (при чтении файла без каких-либо ошибок)

+0

Пункт 3 неверен. Он не тестирует NULL, он использует булевский оператор потока для проверки условия ошибки в потоке. – user4581301

+0

@ user4581301 Я думал, что это похоже на то, как мы перебираем связанный список. Ehm спасибо за урок, я его отредактирую. Можете ли вы уточнить больше? –

+1

это сокращение для 'while (! File-> fail())'. Подробнее здесь: http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool (я должен исправить. В C++ 11 это сокращение. Раньше это было только похоже) – user4581301