Понимание указателей с файловым вводом / выводом в C ++ - PullRequest
2 голосов
/ 24 января 2010

Я пытаюсь лучше понять указатели. Моим классным заданием было создать функцию для прототипа void OpenFile(const char *fileName, ifstream &inFile).

 void OpenFile(const char *fileName, ifstream &inFile) 
 {
  inFile.open(FILENAME, ios_base::in);
  if (!inFile.is_open()) {
   cerr << "Could not open file " << fileName << "\n";
   exit(EXIT_FAILURE);
  }
  else {
   cout << "File Open successful";
  }
 }

 //FILENAME is defined as: const char * const FILENAME = "file.txt";

 // function is called in main with:  OpenFile(FILENAME, inFile);

Я думаю, что я не понимаю, это const char * и & для двух аргументов. Я предполагаю, что первый аргумент является const char *, потому что именно так присваивание определяет FILENAME Но должен ли я использовать указатель в этом случае? Могу я только что сделать

    const char FILENAME = "file.txt";

и в моем OpenFile первый параметр просто принимает const char. И опять же, зачем мне нужна ссылка на второй параметр моей функции? Определенно запутался, когда использовать указатели, а когда использовать ссылки. Спасибо!

Ответы [ 4 ]

2 голосов
/ 24 января 2010

Во-первых, позвольте мне сказать, что ваша функция выглядит немного странно, если вы передаете параметр fileName, но затем используете FILENAME внутри, а fileName просто используется для вывода ошибок.Я думаю, это не совсем правильно.

Во-вторых, проблема const char *.Сам по себе char - это просто char (символ) и как таковой только один символ.Таким образом, const char FILENAME = "file.txt" не будет работать.Вместо этого вам понадобится массив символов (const char FILENAME [] = ...), или, как это делается в C, используйте указатель на место в памяти текста, то есть char *.

Поскольку вы, кажется, используете STL, может быть хорошей идеей будет просто отказаться от char * и вместо этого преобразовать в std :: string.

В-третьих, указатель на ссылку часто является делом вкуса,В конце они оба делают то же самое, и в компиляторе они фактически одинаковы.Единственное различие в использовании заключается в том, что вы не можете передать пустую (нулевую) ссылку, но вы можете передать нулевой указатель.Поэтому обычно рекомендуется использовать ссылки, если вам действительно нужен переданный объект, и указатель на все, что может быть необязательным (в этом случае вы должны обработать ptr == NULL).Также строки C, представляющие собой char * и другую выделенную вручную память, обычно отправляются через указатель.

2 голосов
/ 24 января 2010
  • fileName - это традиционная строка C. Вы передаете строку в функцию, передавая указатель на первый символ строки.

  • inFile является ссылкой на переменную ifstream. Поскольку он передается по ссылке, ваша функция может изменить его и вернуть вызывающей программе. В этом случае ваша функция открывает файл и возвращает переменную open file.

2 голосов
/ 24 января 2010

const char * (или char const *) - указатель на символ (char), который нельзя изменить (const).Обычно это означает строку в стиле C, где на самом деле есть массив символов, а указатель указывает на первый, а после последнего символа строки есть символ '\ 0', который сообщает программе, что строка заканчивается там..

Вы можете сделать const char foo = 'a', сохранив в нем один символ, но присвоить строку в переменную const char невозможно, потому что помещение массива (то же, что и строки C) всимвольная переменная не имеет смысла.

Вы также можете использовать указатель для второго параметра, но использование ссылок - лучший стиль в C ++, когда вам не нужны специфичные для указателя функции.Ссылки всегда указывают на ровно один элемент (а не на массив, на который способны указатели), и они всегда указывают куда-то (не на что указывает NULL-указатель).Они также намного проще в использовании, потому что вы можете использовать ссылочную переменную так же, как это был объект, на который она указывает, где с указателями вам нужно написать (* ptr) для доступа к указанному объекту.

Что вам действительно нужно, так это некоторые базовые уроки C ++, прежде чем пытаться выполнить упражнение.Читайте об указателях и ссылках в учебнике или других материалах.Я бы дал ссылку на онлайн-материал, но я не знаю ни одного достаточно хорошего.

1 голос
/ 24 января 2010

Тип char предназначен для одиночных символов (например, char example = 'e'). Так что const char FILENAME = "file.txt" не будет компилироваться.

Вот хороший учебник по строкам C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...